C# 使用XmlReader只获取孩子

C# 使用XmlReader只获取孩子,c#,xmlreader,C#,Xmlreader,我有以下XML: <root> <row> <data1>Data</data1> <data2>Data</data2> <data3>Data <subdata>SubData</subdata> </data3> </row> </root> 资料 资料 资料 子数据 我想使用

我有以下XML:

<root>
  <row>
     <data1>Data</data1>
     <data2>Data</data2>
     <data3>Data
         <subdata>SubData</subdata>
     </data3>
  </row>
</root>

资料
资料
资料
子数据

我想使用
XmlReader
只读取
元素,而不知道
dataX
的确切名称。我找到了
ReadToNextSibling
方法,但它需要一个名称,我不知道。

您可以使用以下XPath将元素筛选为
元素:

/root/row/*[substring(name(),0,5)='data']

但是,
XmlReader
不能在其任何导航方法(如
ReadToNextSibling


您可以使用,它可以从
XmlReader
对象实例化,如下所示:

XPathReader xpr  = new XPathReader("MyXml.xml", "/root/row/*[substring(name(), 0,5) = 'data']"); 

while (xpr.ReadUntilMatch()) {
   Console.WriteLine(xpr.ReadString()); 
} 
(您可以从Microsoft此处下载
XPathReader


如果您不喜欢
XPathReader
,可以使用
XmlDocument
执行以下操作:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xml);
XmlNode root = xDoc.DocumentElement;

foreach (XmlNode item in root.SelectNodes(@"/root/row/*[substring(name(),0,5) = 'data']"))
{
    Console.WriteLine(item.Value);
}

编辑

更好的
XPath
实际上应该是:

/root/row/*[starts-with(name(),'data')]

XDocument是你的选择吗?@YaugenVlasau我考虑过,但这个文件可能很大。只是居里。。。您的问题是否可能是重复的?您是否考虑过使用?您可以迭代每个元素,并检查其名称是否以
dataX
开头。不过,它可能无法很好地适应大数据。
/root/row/*[starts-with(name(),'data')]