[英]How to get nodes from XML file without its attribute and put to a List of string
我想显示没有属性的子节点的标签名称。 然后这些标签名称(节点)应该放在一个字符串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>
所以,我想在控制台 output 中得到的效果如下图所示:
ID
MANUFACTURER
MODEL
然后我想将该 ID、MANUFACTURER 和 MODEL 标记名称存储在字符串List
中。
这是我到目前为止尝试的代码:
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
将项目添加到列表基本上添加了与上面所示相同的内容。
我究竟做错了什么?
您可以循环遍历子节点:
1-您可以像HashSet
一样定义xmlNodes
以避免多个标签,例如:
HashSet<string> xmlNodes = new HashSet<string>();
2 - 改变一点代码,如:
....
XmlNodeList nodeList = xmlDocument.SelectNodes("ROOT/CAR");
foreach (XmlNode node in nodeList)
{
foreach(XmlNode element in node.ChildNodes)
{
if (element.NodeType == XmlNodeType.Element)
xmlNodes.Add(element.Name);
}
}
演示
Console.WriteLine(string.Join(", ", xmlNodes));
结果
ID, MANUFACTURER, MODEL
我希望你觉得这有帮助。
如果您必须使用 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();
这就是你所需要的。 也易于阅读,获取“汽车”节点的所有后代并获取其中所有不同的 XElement 名称。
另一种方法-
List<string> elements = xdoc.Descendants("Car").First()
.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).ToList();
在这种情况下,我删除了“distinct”,而只得到了第一个 Car 节点ONLY 。 您可以看到差异 - 如果在任何情况下某个其他 Car 节点有一个额外的元素,您将无法通过这种方式获取该信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.