Frage

Ich habe eine Sammlung von Daten in XDocuments und Datentabellen gespeichert ist, und ich mag sowohl als einzigen einheitlichen Datenraum mit XPath-Abfragen adressieren. So zum Beispiel „/ Root / Tische / Bestellungen / Vorname“ würde den Wert der Vornamen Spalte in jeder Zeile der Datatable namens „Aufträge“ holen.

Gibt es eine Möglichkeit, dies zu tun, ohne alle Datensätze in der Datentabelle in die XDocument zu Kopieren?

Ich verwende .NET 3.5

War es hilfreich?

Lösung 2

Ich dachte schließlich heraus, die Antwort auf diese selbst. Ich entdeckte eine Klasse in System.Xml.Linq XStreamingElement genannt, die eine XML-Struktur erstellen können aus einer LINQ Ausdruck on-the-fly. Hier ist ein Beispiel einer Datentabelle in ein XML-Raum des Gießens.

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

Das Ergebnis ist ein XElement (TableRoot) mit einer Struktur ähnlich die folgenden, unter der Annahme, das Wörterbuch eine Tabelle enthält als „Orders“ mit zwei Reihen.

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

Das kann mit einer größeren XElement / XDocument basierten Hierarchie und abgefragt mit XPath zusammengefasst werden.

Andere Tipps

.NETs XPath Sachen arbeiten auf der IXPathNavigable Schnittstelle. Jeder hat eine IXPathNavigable Create () Methode, die ein IXPathNavigator zurückgibt.

Um alle Datenquellen als ein großes Dokument zu belichten Sie benötigen würde, eine Klasse erstellen IXPathNavigable Implementierung enthält alle XPath-Datenquellen. Die Create Methode sollte eine benutzerdefinierte XPathNavigator zurückgeben, um den Inhalt als eine große Datenquelle aussetzt.

Leider diese Navigator Umsetzung ist etwas fummelig und Pflege besonders getroffen werden müssen, wenn zwischen Dokumenten springen,

Sie suchen nach etwas Ähnliches, was ich fragte in Bezug auf XPath Fremdschlüssel ?

Wie die XPath-Empfehlung sagt: „Der Hauptzweck von XPath ist Teile eines XML-Dokuments zu adressieren.“ Es hat keine Einrichtung für Teile von mehr als ein XML-Dokument Adressierung. Sie werden ein einzelnes XML-Dokument erstellen, wenn Sie das tun wollen, was Sie zu tun versuchen.

würden Sie haben Ihre Dokumente fusionieren oder zumin damit die gleichen Transformationen auf alle Dokumente durchführen. Sie können prüfen, Ihre Dokumente in einem einzigen Datentabelle bewegen, dann die Datatable Filterung, wenn der XPath / XSLT nicht tun können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top