1

我有一组存储在 XDocuments 和 DataTables 中的数据,我希望将这两个数据都作为一个带有 XPath 查询的统一数据空间来处理。因此,例如,“/Root/Tables/Orders/FirstName”将获取名为“Orders”的 DataTable 的每一行中 Firstname 列的值。

有没有办法在不将 DataTable 中的所有记录复制到 XDocument 的情况下做到这一点?

我正在使用.Net 3.5

4

5 回答 5

1

.NETs XPath 的东西在 IXPathNavigable 接口上运行。每个 IXPathNavigable 都有一个返回 IXPathNavigator 的 CreateNavigator() 方法。

为了将所有数据源公开为一个大文档,您需要创建一个实现 IXPathNavigable 的类,其中包含所有 xpath 数据源。CreateNavigator 方法应该返回一个自定义 XPathNavigator,它将内容公开为一个大型数据源。

不幸的是,实现这个导航器有些繁琐,必须小心,尤其是在文档之间跳转时,

于 2008-10-05T22:15:08.820 回答
1

我最终自己想出了这个问题的答案。我在 System.Xml.LINQ 中发现了一个名为 XStreamingElement 的类,它可以从 LINQ 表达式动态创建 XML 结构。这是一个将 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])))))

结果是一个具有类似于以下结构的 XElement (TableRoot),假设字典包含一个名为“Orders”的表,其中包含两行。

<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 回答
0

您是否正在寻找类似于我询问的有关XPath 外键的内容?

于 2008-09-29T18:54:54.970 回答
0

正如 XPath 建议所说,“XPath 的主要目的是处理 XML 文档的各个部分。” 它没有任何工具来处理多个 XML 文档的各个部分。如果你想做你想做的事,你必须建立一个单一的 XML 文档。

于 2008-09-29T21:10:20.743 回答
-1

您将不得不合并您的文档,或者至少对所有文档执行相同的转换。您可以考虑将文档移动到单个 DataTable,然后在 XPath / XSLT 不可行时过滤 DataTable。

于 2008-09-29T21:26:21.500 回答