XPath: выберите узел, не выбирая его потомков - PullRequest
2 голосов
/ 18 мая 2011

Как я могу использовать XPath для выбора узла без извлечения всех его дочерних узлов? Например, в следующем XML-документе:

<parentnode>
  <node1 a="b" b="c">
    <child1/>
    <child2/>
    ... many many child nodes
    <childN/>
  </node1>
  <node2/>
</parentnode>

Я бы хотел иметь возможность выбрать элемент 'node1' для проверки его атрибутов, но без выбора дочерних узлов, которые мне не нужно анализировать и которые могут содержать тысячи элементов, что влияет на производительность. запроса (вывод которого используется для построения своего рода дерева DOM с массивами и словарями в сторонней библиотеке).

Обновление: просто для ясности, упомянутая мной сторонняя библиотека на самом деле является просто оболочкой Objective-C вокруг синтаксического анализатора libxml2, который создает дерево DOM из классов Foundation с результатом любого запроса XPath , Сами запросы выполняются над уже проанализированным документом (xmlDocPtr), который повторно используется для всех запросов, поэтому да, как говорят многие ответы, документ уже DOM'-обработан на уровне C, но реализация оболочки Objective-C обеспечивает производительность хит в этом конкретном сценарии. Я мог бы изменить эту библиотеку, чтобы при желании не получать дочерние узлы выбранного узла, но я подумал, что, вероятно, будет простой способ получить только атрибуты узла с помощью запроса.

Ответы [ 4 ]

5 голосов
/ 19 мая 2011

Выражение XPath, подобное / a / b / c, выберет элементы c: оно не выберет их дочерние элементы. Многие люди считают, что он также выбирает дочерние элементы, потому что многие инструменты будут показывать результат выражения XPath, показывая вам все поддерево с корнем в элементе c. Можно понять, почему они это делают - он показывает вам визуально то, что вы выбрали, но само выражение XPath просто возвращает указатель на выбранный элемент, и то, куда вы идете, зависит только от вас. (Некоторые инструменты вместо того, чтобы показывать вам поддерево с корнем в элементе, показывают путь к узлу со всеми его предками - это одинаково верно.)

1 голос
/ 18 мая 2011

Если вам просто нужны атрибуты, просто выберите атрибуты: / parentnode / node1 / @ *

Но (как отмечено в другом ответе) и процессор Xpath все равно должен проанализировать весь файл.Вы не будете много экономить.

Если вы хотите только проанализировать часть файла и затем остановиться после получения необходимой информации, вам, вероятно, следует использовать SAX или какой-либо другой API, который дает вам более низкий уровень контроля над синтаксическим анализом.

0 голосов
/ 18 мая 2011

используйте @ для получения атрибутов, например:

  • / parentnode / node1 / @ a - получит значение "b"
  • / parentnode / node1 / @ b - получит значение "c"
0 голосов
/ 18 мая 2011

Что ж, если все уже DOM работает, вы больше не будете выполнять DOMing, выбрав XPATH для node1. В этот момент тот факт, что у узла 1 есть дочерние элементы, не имеет отношения к производительности.

Однако, если мы предположим, что все дело не в DOM, то мы, вероятно, говорим о читателе только для форварда. Некоторые читатели только для пересылки могут выполнить XPATHing, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...