我想显示没有其属性的子节点的标签名称。然后,应将这些标签名称(节点)放入List
字符串中。这是我的XML文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<CAR>
<ID>21</ID>
<MANUFACTURER>Ford</MANUFACTURER>
<MODEL>Fiesta</MODEL>
</CAR>
<CAR>
<ID>22</ID>
<MANUFACTURER>Peugeot</MANUFACTURER>
<MODEL>508</MODEL>
</CAR>
</ROOT>
因此,我想在控制台输出中获得的效果如下所示:
ID
MANUFACTURER
MODEL
然后,我想将ID,MANUFACTURER和MODEL标记名称存储在List
字符串a中。
这是我到目前为止尝试过的代码:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.PreserveWhitespace = true;
try
{
xmlDocument.Load("XMLFile.xml");
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex);
}
Console.WriteLine(xmlDocument.OuterXml);
XmlNodeList nodeList = xmlDocument.SelectNodes("ROOT/CAR");
foreach(XmlNode node in nodeList)
{
Console.WriteLine(node.ChildNodes);
xmlNodes.Add(node.ChildNodes.ToString());
}
问题在于它没有显示我想要的方式。结果,我只得到两个System.Xml.XmlChildNodes
似乎对应于两个<CAR>
节点的对象,而不是它的三个子节点,例如ID,MANUFACTURER和MODEL。
System.Xml.XmlChildNodes
System.Xml.XmlChildNodes
将项目添加到列表中基本上会添加与上述相同的内容。
我究竟做错了什么?
如果必须使用XmlDocument,则可以-
List<string> elements = new List<string>();
XmlNodeList CarNodes = xml.SelectNodes("Root/Car");
foreach(XmlNode c in CarNodes)
{
foreach(XmlNode n in c.ChildNodes)
{
if (!elements.Contains(n.Name))
{
elements.Add(n.Name);
}
}
}
但是我发现XDocument更简单,可读性更好。
XDocument xdoc = XDocument.Parse(yourXmlString);
List<string> elements = xdoc.Descendants("Car")
.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).Distinct().ToList();
这就是您所需要的。同样易于阅读,获取“ Car”节点的所有后代,并获取其中所有XElement的不同名称。
另一种方式-
List<string> elements = xdoc.Descendants("Car").First()
.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).ToList();
在这种情况下,我已删除了“独特的”和而仅获得第一个轿厢节点只。您可以看到区别-如果在任何情况下其他Car节点都具有额外的元素,则您将错过通过这种方式获取信息的机会。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句