我有一个存储在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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top