使用XmlReader只获取子级

本文关键字:获取 XmlReader 使用 | 更新日期: 2023-09-27 18:27:19

我有这个XML:

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

并且我想在不知道dataX的确切名称的情况下使用XmlReader来仅读取<dataX>元素。我找到了ReadToNextSibling方法,但它需要一个名称,我不知道。

使用XmlReader只获取子级

您可以使用以下XPath将元素过滤为仅<dataN>元素:

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

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

但是,XmlReader在其任何导航方法(如ReadToNextSibling )中都不能对元素名称使用xPath或通配符


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

XPathReader xpr  = new XPathReader("MyXml.xml", "/root/row/*[substring(name(), 0,5) = 'data']"); 
while (xpr.ReadUntilMatch()) {
   Console.WriteLine(xpr.ReadString()); 
} 

(您可以在此处从Microsoft下载XPathReader:https://www.microsoft.com/en-us/download/details.aspx?id=22677)


如果你不喜欢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')]