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