如何读取具有与其祖先同名的子节点的XML文件?
本文关键字:祖先 子节点 文件 XML 何读取 读取 | 更新日期: 2023-09-27 18:04:57
我在c# Visual web dev 2010上阅读下面的XML文件有困难。如您所见,Category既可以是父名称,也可以是子名称。当我尝试xmldataset。ReadXml会报错,表类别不能是它自己的子元素
还有其他方法可以读取这种XML吗?
一个快速的示例指南将不胜感激。
<Categories>
<Category id="10000000">
<name>Clothing</name>
<Children>
<Category id="10010000">
<name>Handbags & Luggage</name>
<Children>
<Category id="10010800">
<name>Travel Accessories</name>
</Category>
</Children>
</Category>
</Children>
</Category>
</Categories>
我想xpath会给你你想要的。
XmlNodeList nodes = myXmlDoc.SelectNodes("//name");
"//"应该返回所有<name>
节点,无论它们在xml文档中的位置。然后,您可以对<name>
节点列表做任何您想做的事情。例如
foreach (XmlNode node in nodes)
{
console.WriteLine(node.InnerText);
}
想知道的人,
我把它整理成这样:
XmlTextReader xr = new XmlTextReader("test.xml");
int i=0;
string[] ss;
while (xr.Read())
{
Console.Write(xr.Name);
if (xr.Name.ToString() == "name") { ss[i] = xr.ReadString(); i++ };
}
如果您只想要数组中的name字段,那么请尝试下面的代码。可能有一些小语法错误!
XmlDocument xd;
XmlNodeList xnl;
int i;
string[] s;
xd = new XmlDocument();
xd.Load(xmlFileName);
xnl = xd.SelectNodes("//Category/name");
i = 0;
s = new string[xnl.Count];
foreach(XmlNode xn in xnl)
{
// xn will be an object of type XmlElement,
// which exposes the value of the text it contains through the InnerText property
s[i++] = xn.InnerText;
}
// an array of strings named 's' is available at this point.
// NB: I have omitted all manner of error checking here for clarity of code.
更新:我没有正确阅读您的示例XML。我指定了错误的XML路径。我指定了读取<Category name="Blah">...</Category>
的路径,而你的样本有<Category><name>Blah></name>...</Category>
。道歉。
请参阅我对您自己的解决方案的评论,尽管公平地说,使用XmlReader将比使用XmlDocument快得多。
使用LINQ To XML以下代码
XDocument xmlDoc = XDocument.Load(new StringReader(@"<Categories>
<Category id='10000000'>
<name>Clothing</name>
<Children>
<Category id='10010000'>
<name>Handbags & Luggage</name>
<Children>
<Category id='10010800'>
<name>Travel Accessories</name>
</Category>
</Children>
</Category>
</Children>
</Category>
</Categories>
"));
var names = xmlDoc.Root.Descendants("name")
.Select(n => n.Value).ToList();
names.ForEach(n => Console.WriteLine(n));
输出Clothing
Handbags & Luggage
Travel Accessories
使用LINQPad进行了测试。