繁体   English   中英

如何从没有属性的 XML 文件中获取节点并放入字符串列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM