C# 在XPath中抽象存储数据结构
我有一个存储在XDocuments和DataTables中的数据集合,我想用XPath查询将它们作为一个统一的数据空间来处理。因此,例如,“/Root/Tables/Orders/FirstName”将在名为“Orders”的数据表的每一行中获取FirstName列的值 有没有一种方法可以在不将DataTable中的所有记录复制到XDocument的情况下执行此操作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建议所说
我正在使用.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的东西,我正在研究这一点