1

XDocuments と DataTables に格納されたデータのコレクションがあり、XPath クエリを使用して、両方を 1 つの統合されたデータ スペースとして扱いたいと考えています。たとえば、"/Root/Tables/Orders/FirstName" は、"Orders" という名前の DataTable のすべての行の Firstname 列の値を取得します。

DataTable のすべてのレコードを XDocument にコピーせずにこれを行う方法はありますか?

私は.Net 3.5を使用しています

4

5 に答える 5

1

私は最終的にこれに対する答えを自分で理解しました。System.Xml.LINQで、LINQ式からオンザフライでXML構造を作成できるXStreamingElementというクラスを発見しました。これは、DataTableを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])))))

結果は、ディクショナリに2行の「Orders」という1つのテーブルが含まれていると仮定すると、次のような構造のXElement(TableRoot)になります。

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

これは、より大きなXElement / XDocumentベースの階層とマージして、XPathで照会できます。

于 2008-10-22T17:45:04.740 に答える
1

.NET の XPath は IXPathNavigable インターフェイスで動作します。すべての IXPathNavigable には、IXPathNavigator を返す CreateNavigator() メソッドがあります。

すべてのデータ ソースを 1 つの大きなドキュメントとして公開するには、すべての xpath データ ソースを含む IXPathNavigable を実装するクラスを作成する必要があります。CreateNavigator メソッドは、コンテンツを 1 つの大きなデータ ソースとして公開するカスタム XPathNavigator を返す必要があります。

残念ながら、このナビゲーターの実装はやや面倒であり、特にドキュメント間をジャンプするときは注意が必要です。

于 2008-10-05T22:15:08.820 に答える
0

XPathの推奨事項にあるように、「XPathの主な目的は、XMLドキュメントの一部をアドレス指定することです」。複数のXMLドキュメントの一部をアドレス指定する機能はありません。実行しようとしていることを実行したい場合は、単一のXMLドキュメントを作成する必要があります。

于 2008-09-29T21:10:20.743 に答える
0

XPath 外部キーに関して私が尋ねたことに似たものをお探しですか?

于 2008-09-29T18:54:54.970 に答える
-1

ドキュメントをマージするか、少なくともすべてのドキュメントに対して同じ変換を実行する必要があります。ドキュメントを単一のDataTableに移動し、XPath / XSLTが実行できない場合は、DataTableをフィルタリングすることを検討してください。

于 2008-09-29T21:26:21.500 に答える