1

我有两个版本的 XmlDocument

版本 1

<?xml version="1.0" encoding="UTF-8"?>
<topElement>

<childElement1>Value</childElement1>
<childElement2>Value</childElement2> 
...
</topElement>

版本 2

<?xml version="1.0" encoding="UTF-8"?>
<topElement>

<group1>
<childElement1>Value</childElement1>
<childElement2>Value</childElement2> 
</group1>

<group2>
<childElement1>Value</childElement1>
<childElement2>Value</childElement2> 
</group2>
</topElement>

在这两种情况下,我都需要获取所有 childElements 的所有值并将它们添加到 CustomObject 的集合中。据我了解,这只能通过迭代来完成。

所以我得到了顶部节点,然后像这样:

CustomObject getLow(XmlNode node, CustomObject customObject)
{
    foreach (XmlNode n in node.ChildNodes)
    {
        if (n.HasChildNodes == true)
        {
            getLow(n);
        }
        customObject.collection.Add(n.Name, n.InnerText);
    }
    return customObject;
}

毫无疑问这是错误的,有人可以帮我在这两种情况下都得到正确的结果吗?

4

3 回答 3

3

您可以将 Xpath 与您的 XmlDocument 一起使用:

XmlDocument xmlDoc = new XmlDocument("yourxml.xml");
foreach (XmlNode childElement in xmlDoc.SelectNodes("//childElement"))
{
    customObject.collection.Add(childElement.Name, childElement.InnerText);
}
于 2013-02-01T14:31:36.203 回答
1

循环不是唯一的方法——另一种方法是生成具有 XML 属性的自定义类的对象图,并使用 XML 序列化器将 XML 转换为对象图。

有关详细信息,请参阅http://msdn.microsoft.com/en-gb/library/system.xml.serialization.xmlserializer.aspx

另一种方法是使用 XDocument 并使用 linq 直接从 XDocument 中查询您想要的值。

请参阅使用 Linq 和 XDocument,我可以获取父标记下的所有子元素吗?

希望这可以帮助

于 2013-02-01T14:21:22.403 回答
1

您应该能够使用一些 xPath 来获取您正在寻找的节点。

尝试类似的东西

node.SelectNodes("//*[count(child::*)=0]")
于 2013-02-01T14:30:59.900 回答