使用XmlReader来获取孩子

时间:2015-12-17 13:32:27

标签: c# xmlreader

我有这个XML:

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用以下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下载XPathReaderhttps://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')]