Pregunta

Tengo una colección de datos almacenados en XDocuments y DataTables, y me gustaría abordarlos como un único espacio de datos unificado con consultas XPath. Entonces, por ejemplo, " / Root / Tables / Orders / FirstName " buscaría el valor de la columna Nombre en cada fila de la tabla de datos denominada " Pedidos " ;.

¿Hay alguna manera de hacer esto sin copiar todos los registros de la DataTable en el XDocument?

Estoy usando .Net 3.5

¿Fue útil?

Solución 2

Eventualmente descubrí la respuesta a esto yo mismo. Descubrí una clase en System.Xml.LINQ llamada XStreamingElement que puede crear una estructura XML sobre la marcha a partir de una expresión LINQ. Aquí hay un ejemplo de cómo convertir una DataTable en un espacio XML.

Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
    from t in Tables
    select new XStreamingElement(t.Key,
               from DataRow r in t.Value.Rows
               select new XStreamingElement("row",
                          from DataColumn c in t.Value.Columns
                          select new XElement(c.ColumnName, r[c])))))

El resultado es un XElement (TableRoot) con una estructura similar a la siguiente, suponiendo que el diccionario contenga una tabla llamada " Orders " con dos filas.

<Tables>
    <Orders>
        <row>
            <sku>12345</sku>
            <quantity>2</quantity>
            <price>5.95</price>
        </row>
        <row>
            <sku>54321</sku>
            <quantity>3</quantity>
            <price>2.95</price>
        </row>
    </Orders>
</Tables>

Eso se puede combinar con una jerarquía más grande basada en XElement / XDocument y consultar con XPath.

Otros consejos

.NETs XPath cosas opera en la interfaz IXPathNavigable. Cada IXPathNavigable tiene un método CreateNavigator () que devuelve un IXPathNavigator.

Para exponer todas sus fuentes de datos como un documento grande, necesitaría crear una clase que implemente IXPathNavigable, que contenga todas las fuentes de datos xpath. El método CreateNavigator debería devolver un XPathNavigator personalizado que expone el contenido como una fuente de datos grande.

Desafortunadamente, implementar este navegador es algo complicado, y se debe tener cuidado especialmente al saltar entre documentos,

¿Está buscando algo similar a lo que pregunté con respecto a Claves externas XPath ?

Como dice la recomendación de XPath, "El propósito principal de XPath es abordar partes de un documento XML". No tiene ninguna facilidad para abordar partes de más de un documento XML. Tendrá que crear un solo documento XML si desea hacer lo que intenta hacer.

Tendría que fusionar sus documentos, o al menos realizar las mismas transformaciones en todos sus documentos. Puede considerar mover sus documentos a una única DataTable y luego filtrar la DataTable si XPath / XSLT no es factible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top