2010-05-04 4 views
0

Сценарий:Обработка повторяющихся узлов в XML

Я разбор значения из файла XML с помощью C# и имеет следующий метод:

private static string GetXMLNodeValue(XmlNode basenode, string strNodePath) 
    { 
     if (basenode.SelectSingleNode(strNodePath) != null) 
      return (basenode.SelectSingleNode(strNodePath).InnerText); 
     else 
      return String.Empty; 
    } 

Чтобы получить конкретное значение из файла XML, я обычно передают корневой узел и путь типа «parentnode/item»

Недавно я столкнулся с проблемой, когда два узла на одном уровне документа имеют одно и то же имя.

Почему:

Дубликат узлы все должны быть прочитаны и использованы; у них есть дочерние узлы с разными значениями (которые могут различать их). В настоящее время у меня есть только два узла, каждый из которых называется < Процесс > и подпункты с именем < Имя >, которые содержат уникальные имена. Другие вспомогательные узлы содержат различные значения, такие как использование памяти. При обработке и хранении значений для подузлов я бы по существу игнорировал имя родительского узла и использовал свои собственные имена на основе поднабора <. Значение >.

Вопрос:

Что является лучшим способом для получения значений для дублирующих названных узлов отчетливо? Моя мысль заключалась в том, чтобы загрузить все значения, соответствующие имени узла, в массив, а затем использовать индекс массива для ссылки на них. Я не уверен, как это реализовать. (Я не очень хорошо разбирается в XML-навигации.)

Пример XML

<?xml version="1.0" ?> 
<info> 
    <processes> 
    <process> 
     <name>program1</name> 
     <memory_use>24.8</memory_use> 
    </process> 
    <process> 
     <name>program2</name> 
     <memory_use>19.0</memory_use> 
    </process> 
    </processes> 
</info> 
+0

Я думаю, что вам нужно разместить пример типа XML вы имеете в виду. Ответ, вероятно, «просто используйте SelectNodes», но отправьте пример, и мы сможем это точно определить. –

+0

Это очень простой XML, я опубликую его фрагмент. – JYelton

ответ

3

метод использования SelectNodes вместо этого он дает вам список всех узлов, соответствующих запросу Xpath

+0

Я пойду посмотрю, похоже, что это вернет массив, где я мог бы повторять каждый результат? – JYelton

+0

Он возвращает «IEnumerable» узлов. Вы можете использовать 'foreach' для их перебора. –

+0

Это сработало; спасибо, mfeingold и Джон. – JYelton

1

Ответ на ваш вопрос, "это зависит".

Это зависит от того, что вы намерены делать с «дублирующимися» узлами. Что значит, что там должно быть более одного с тем же именем? Это была ошибка в программе, которая сгенерировала XML? Правильно ли это, и допускается неограниченное количество таких узлов? Что они означают, когда их более одного?

Прежде чем создавать код, обрабатывающий «дублирующие» узлы, вам необходимо ответить на эти вопросы.

+0

Я расскажу об этом больше в вопросе, спасибо за то, что вы подняли точку. – JYelton

Смежные вопросы