#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 в зависимости от его типа.