Domanda

Ho una raccolta di dati archiviati in XDocuments e DataTables e vorrei indirizzarli entrambi come un unico spazio dati unificato con query XPath. Ad esempio, " / Root / Tables / Orders / FirstName " recupererebbe il valore della colonna Nome in ogni riga della DataTable denominata " Orders " ;.

Esiste un modo per farlo senza copiare tutti i record nella Tabella dati in XDocument?

Sto usando .Net 3.5

È stato utile?

Soluzione 2

Alla fine ho capito da solo la risposta. Ho scoperto una classe in System.Xml.LINQ chiamata XStreamingElement che può creare al volo una struttura XML da un'espressione LINQ. Ecco un esempio del cast di una DataTable in uno spazio 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])))))

Il risultato è un XElement (TableRoot) con una struttura simile alla seguente, supponendo che il dizionario contenga una tabella chiamata " Orders " con due file.

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

Che può essere unito a una gerarchia basata su XElement / XDocument più ampia e interrogato con XPath.

Altri suggerimenti

Il materiale XPath di .NET funziona sull'interfaccia IXPathNavigable. Ogni IXPathNavigable ha un metodo CreateNavigator () che restituisce un IXPathNavigator.

Per esporre tutte le tue origini dati come un unico documento di grandi dimensioni, devi creare una classe che implementa IXPathNavigable, contenente tutte le origini dati xpath. Il metodo CreateNavigator dovrebbe restituire un XPathNavigator personalizzato che espone i contenuti come un'unica fonte di dati di grandi dimensioni.

Sfortunatamente, l'implementazione di questo navigatore è piuttosto complicata e bisogna fare attenzione soprattutto quando si passa da un documento all'altro,

Stai cercando qualcosa di simile a quello che ho chiesto riguardo a chiavi esterne XPath ?

Come afferma la raccomandazione XPath, "lo scopo principale di XPath è indirizzare parti di un documento XML." Non ha alcuna possibilità di indirizzare parti di più di un documento XML. Dovrai creare un singolo documento XML se vuoi fare quello che stai cercando di fare.

Dovresti unire i tuoi documenti, o almeno eseguire le stesse trasformazioni su tutti i tuoi documenti. Puoi considerare di spostare i tuoi documenti in una singola DataTable, quindi di filtrare la DataTable se XPath / XSLT non è possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top