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