Достижение сути XmlDocument — C#

У меня есть две версии 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>

В обоих случаях мне нужно получить все значения для всех дочерних элементов и добавить их в коллекцию 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;
}

Без сомнения, это неправильно, пожалуйста, может ли кто-нибудь помочь мне получить правильный результат в обоих случаях?


person Alex    schedule 01.02.2013    source источник
comment
Хорошо, возможно, цикл While не лучшая идея =) Должен ли я вместо этого использовать оператор if?   -  person Alex    schedule 01.02.2013
comment
Что такое getLow(XmlNode xmlNode)   -  person t3hn00b    schedule 01.02.2013
comment
Если у n есть дочерние узлы, вы никогда не покинете этот while цикл.   -  person t3hn00b    schedule 01.02.2013
comment
@ t3hn00b ну, мой плохой, ошибся. В основном метод вызывает сам себя.   -  person Alex    schedule 01.02.2013


Ответы (3)


Вы можете использовать Xpath с вашим XmlDocument:

XmlDocument xmlDoc = new XmlDocument("yourxml.xml");
foreach (XmlNode childElement in xmlDoc.SelectNodes("//childElement"))
{
    customObject.collection.Add(childElement.Name, childElement.InnerText);
}
person Wes Cumberland    schedule 01.02.2013

Зацикливание — не единственный способ. Другим способом может быть создание графа объектов пользовательских классов с атрибутами XML и использование сериализатора XML для преобразования XML в граф объектов.

См. http://msdn.microsoft.com/en-gb/library/system.xml.serialization.xmlserializer.aspx для получения подробной информации.

Альтернативой этому может быть использование XDocument и использование linq для запроса нужных значений прямо из XDocument.

См. Использование Linq и XDocument, могу ли я получить все дочерние элементы под родительским тегом?

Надеюсь это поможет

person Jay    schedule 01.02.2013

Вы должны иметь возможность использовать некоторые xPath для получения узлов, которые вы ищете.

Попробуйте что-то вроде

node.SelectNodes("//*[count(child::*)=0]")
person Stanley De Boer    schedule 01.02.2013