C# 在XPath中抽象存储数据结构

C# 在XPath中抽象存储数据结构,c#,xml,.net-3.5,datatable,C#,Xml,.net 3.5,Datatable,我有一个存储在XDocuments和DataTables中的数据集合,我想用XPath查询将它们作为一个统一的数据空间来处理。因此,例如,“/Root/Tables/Orders/FirstName”将在名为“Orders”的数据表的每一行中获取FirstName列的值 有没有一种方法可以在不将DataTable中的所有记录复制到XDocument的情况下执行此操作 我正在使用.Net 3.5,您是否正在寻找与我所问的内容类似的内容?您是否正在寻找与我所问的内容类似的内容?正如XPath建议所说

我有一个存储在XDocuments和DataTables中的数据集合,我想用XPath查询将它们作为一个统一的数据空间来处理。因此,例如,“/Root/Tables/Orders/FirstName”将在名为“Orders”的数据表的每一行中获取FirstName列的值

有没有一种方法可以在不将DataTable中的所有记录复制到XDocument的情况下执行此操作


我正在使用.Net 3.5,您是否正在寻找与我所问的内容类似的内容?

您是否正在寻找与我所问的内容类似的内容?

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

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

你必须合并你的文档,或者至少对所有文档执行相同的转换。您可以考虑将文档移动到单个DATABATE,然后如果XPath/XSLT不能执行,则筛选DATABATE。

< P>您必须合并文档,否则将对所有文档执行相同的转换。您可以考虑将文档移动到单个DATABATE,然后如果XPath/XSLT不能执行,则过滤DATABATE。

< P>。每个IXPathNavigatable都有一个CreateNavigator()方法,该方法返回一个IXPathNavigator

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


不幸的是,实现这个导航器有点麻烦,必须特别小心,尤其是在文档之间切换时,

.NETs XPath stuff在IXPathNavigable接口上运行。每个IXPathNavigatable都有一个CreateNavigator()方法,该方法返回一个IXPathNavigator

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


不幸的是,实现这个导航器有点麻烦,尤其是在文档之间切换时,必须小心,

我最终自己找到了答案。我在System.Xml.LINQ中发现了一个名为XStreamingElement的类,它可以从LINQ表达式动态创建Xml结构。下面是一个将数据表强制转换到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])))))
Dictionary Tables=newdictionary();
// ... 填充表的字典。。。
XElement TableRoot=新的XStreamingElement(“表”,
从表中的t开始
选择新的XStreamingElement(t.Key,
从t.Value.Rows中的数据行r
选择新的XStreamingElement(“行”,
来自t.Value.Columns中的数据列c
选择新的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>

12345
2.
5.95
54321
3.
2.95

这可以与更大的基于XElement/XDocument的层次结构合并,并使用XPath进行查询。

我最终自己找到了答案。我在System.Xml.LINQ中发现了一个名为XStreamingElement的类,它可以从LINQ表达式动态创建Xml结构。下面是一个将数据表强制转换到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])))))
Dictionary Tables=newdictionary();
// ... 填充表的字典。。。
XElement TableRoot=新的XStreamingElement(“表”,
从表中的t开始
选择新的XStreamingElement(t.Key,
从t.Value.Rows中的数据行r
选择新的XStreamingElement(“行”,
来自t.Value.Columns中的数据列c
选择新的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>

12345
2.
5.95
54321
3.
2.95

它可以与更大的基于XElement/XDocument的层次结构合并,并使用XPath进行查询。

不,我不这么认为。数据表的内容不是XML文档的一部分。它们位于不同的“后端存储”中。我希望XPath能够看到所有数据,就像它是同一个XDocument的一部分一样。我刚刚发现了一些关于XStreamingElement的东西,我正在研究这一点,我不这么认为。数据表的内容不是XML文档的一部分。它们位于不同的“后端存储”中。我希望XPath能够看到所有数据,就像它是同一个XDocument的一部分一样。我刚刚发现了一些关于XStreamingElement的东西,我正在研究这一点