XmlDocment — как получить узлы путем фильтрации с использованием XPath

#c# #xpath #xmldocument

#c# #xpath #xmldocument

Вопрос:

Если у вас есть XML-документ, и вам нужно найти определенные узлы на основе определенных значений атрибутов (числом 4), какой из них был бы правильным подходом (с точки зрения производительности):-

a) Отфильтруйте XML-документ (с помощью XPath ), чтобы получить список узлов, которые соответствуют любому из значений атрибута, а затем перейдите по отфильтрованному списку узлов, чтобы получить узлы, имеющие определенное значение атрибута, используя If-else.

б) Отфильтруйте XML-документ (с помощью XPath ) для каждого значения атрибута отдельно.

 <Nodes>
  <a class="myclass" type="type1">some text</a>
  <a class="myclass" type="type2">some text</a>
  <img src = "myGraphic.jpg?id={Guid}"/>
</Nodes>
  

Я использую приведенный ниже XPath (который может быть неправильным :-))

 "//A[@class] | //a[@class] | //IMG[@src] | //img[@src]"
  

Цель состоит в том, чтобы получить отдельный список всех a, имеющих type=»type1″, отдельный список type =»type2″ и отдельный список идентификаторов в теге img.

Комментарии:

1. Пожалуйста, покажите пример того, что вы имеете в виду. Не ясно, почему вы просто не использовали бы одно выражение XPath для поиска всех узлов сразу.

2. «почему бы вам просто не использовать одно выражение XPath» — это вариант a) в вопросе. После получения всех узлов сразу нужно ввести If-else, чтобы получить значения узлов для каждого типа значения атрибута. Хороший ли это подход. Добавлен пример.

3. @user: не торопитесь. Необязательно, чтобы это была копия вашего реального XML. Просто что-то, что показывает, что вы имеете в виду относительно значений атрибутов. Например, я не понимаю, зачем вам нужен if / else.

4. Джон, добавил один пример.

5. @user: хорошо, теперь каким XML-узлам вы хотите сопоставить?

Ответ №1:

Мой грубый ответ был бы таким: производительность не будет иметь большого значения, если у вас нет очень большого документа или набора документов.

В этом случае вы, вероятно, захотите использовать SAX, и в любом случае вы захотите просмотреть документ (ы) только один раз и не хранить все это в памяти. Таким образом, вы будете просматривать документы в потоковом режиме, останавливаясь на каждом a элементе и добавляя его в list1 или list2 в зависимости от его типа.