我有一组存储在 XDocuments 和 DataTables 中的数据,我希望将这两个数据都作为一个带有 XPath 查询的统一数据空间来处理。因此,例如,“/Root/Tables/Orders/FirstName”将获取名为“Orders”的 DataTable 的每一行中 Firstname 列的值。
有没有办法在不将 DataTable 中的所有记录复制到 XDocument 的情况下做到这一点?
我正在使用.Net 3.5
.NETs XPath 的东西在 IXPathNavigable 接口上运行。每个 IXPathNavigable 都有一个返回 IXPathNavigator 的 CreateNavigator() 方法。
为了将所有数据源公开为一个大文档,您需要创建一个实现 IXPathNavigable 的类,其中包含所有 xpath 数据源。CreateNavigator 方法应该返回一个自定义 XPathNavigator,它将内容公开为一个大型数据源。
不幸的是,实现这个导航器有些繁琐,必须小心,尤其是在文档之间跳转时,
我最终自己想出了这个问题的答案。我在 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 进行查询。
您是否正在寻找类似于我询问的有关XPath 外键的内容?
正如 XPath 建议所说,“XPath 的主要目的是处理 XML 文档的各个部分。” 它没有任何工具来处理多个 XML 文档的各个部分。如果你想做你想做的事,你必须建立一个单一的 XML 文档。
您将不得不合并您的文档,或者至少对所有文档执行相同的转换。您可以考虑将文档移动到单个 DataTable,然后在 XPath / XSLT 不可行时过滤 DataTable。