Pergunta

Eu tenho uma coleção de dados armazenados em XDocuments e Datatables e gostaria de abordar ambos como um único espaço de dados unificado com consultas XPath. Assim, por exemplo, "/root/tables/orders/primeironame" buscaria o valor da coluna FirstName em todas as fileiras do DataTable nomeado "Ordens".

Existe uma maneira de fazer isso sem copiar todos os registros no DataTable no Xdocument?

Estou usando .NET 3.5

Foi útil?

Solução 2

Acabei descobrindo a resposta para isso. Descobri uma classe em System.xml.linq chamada xStreamingElement que pode criar uma estrutura XML na fly a partir de uma expressão LINQ. Aqui está um exemplo de lançar um datatable em um espaço 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])))))

O resultado é um Xelement (Tableroot) com uma estrutura semelhante à seguinte, assumindo que o dicionário contém uma tabela chamada "Ordens" com duas linhas.

<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>

Isso pode ser mesclado com uma hierarquia baseado em Xelement/XDocument maior e consultado com XPath.

Outras dicas

.Nets XPath Stuff opera na interface ixPathNavigable. Todo ixPathNavigable possui um método cretrenavigator () que retorna um ixpathnavigator.

Para expor todas as suas fontes de dados como um documento grande, você precisaria criar uma classe implementando o IXPathNavigable, contendo todas as fontes de dados XPath. O método CreateNavigator deve retornar um XPathnavigator personalizado que expõe o conteúdo como uma grande fonte de dados.

Infelizmente, a implementação deste navegador é um pouco complicada e os cuidados devem ser tomados especialmente ao pular entre documentos,

Você está procurando algo semelhante ao que eu perguntei a respeito Chaves estrangeiras xpath?

Como diz a recomendação do XPath, "o principal objetivo do XPath é abordar partes de um documento XML". Ele não possui nenhuma instalação para abordar partes de mais de um documento XML. Você terá que criar um único documento XML se quiser fazer o que está tentando fazer.

Você teria que mesclar seus documentos ou para não executar as mesmas transformações em todos os seus documentos. Você pode considerar mover seus documentos para um único datatable e filtrar o DataTable se o XPath / XSLT não for possível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top