【问题标题】:How to get nodes from XML file without its attribute and put to a List of string如何从没有属性的 XML 文件中获取节点并将其放入字符串列表
【发布时间】:2020-05-24 00:01:28
【问题描述】:

我想显示不带属性的子节点的标签名称。然后这些标签名称(节点)应该放在字符串的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 中。

这是我目前尝试过的代码:

            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,这似乎对应于两个&lt;CAR&gt;节点,而不是它的三个子节点,例如ID、MANUFACTURER和MODEL。

System.Xml.XmlChildNodes
System.Xml.XmlChildNodes

将项目添加到列表中基本上添加的内容与上面显示的相同。

我做错了什么?

【问题讨论】:

  • 您要添加到列表中,标签的值或标签名称ID MANUFACTURER MODEL?
  • 不是值,只是标签名称。
  • 我已经添加了一个答案,你能检查一下并告诉我,如果它对你有用。
  • 谢谢,等我回到电脑上试试你的代码

标签: c# xml list


【解决方案1】:

如果你必须使用 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 节点。您可以看到差异 - 如果在任何情况下某个其他 Car 节点有一个额外的元素,那么您将无法通过这种方式获取该信息。

【讨论】:

  • 这是完全适合我需要的答案。虽然我习惯使用 XmlDocument,但 XDocument 也是一种非常好的方式。
【解决方案2】:

您可以循环遍历子节点:

1- 您可以将xmlNodes 定义为HashSet,以避免出现多个标签,例如:

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

希望对您有所帮助。

【讨论】:

  • 我试过你的代码,它确实按预期工作,所以谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多