Что такое код xpath_new_context

Текущий node против контекста node в XSLT/XPath?

В XSLT, в чем разница между «текущим node» и «контекстом node»? Вы можете найти оба используемых здесь термина: http://www.w3.org/TR/xslt.

Когда вы будете использовать тот или иной? Как вы относитесь к каждому?

Текущий node работает независимо от того, какой шаблон работает. Обычно это также является контекстом node, но контекст node имеет особое значение внутри вложенного выражения XPath (часть в квадратных скобках). Там он ссылается на то, что node в настоящее время тестируется на соответствие. Следовательно, контекст node изменяется в выражении XPath, но не в текущем node.

Контекст node может быть сокращен точкой ( . ) или иногда полностью исключен. Это, вероятно, немного запутанно, потому что вне вложенного выражения точка обозначает текущий node. (В этом случае текущий node является контекстом node, поэтому можно сказать, что он является текущим node только ближе, и его более правильно называют контекстом node. Но даже вызовы spec это текущий node здесь.)

Поскольку точка дает вам контекст node, во вложенном выражении XPath пользователю нужен способ вернуться к текущему node, который обрабатывается текущим шаблоном. Вы можете сделать это с помощью функции current() .

Отличие этих двух полезно в некоторых случаях. Например, предположим, что у вас есть такой XML:

Теперь предположим, что вы хотите преобразовать его в LaTeX следующим образом:

Трюк — это сказать, была ли уже использована сноска или нет. Если вы впервые встретили сноску, вы хотите написать команду \footnote ; в противном случае вы хотите написать команду \footnotemark . Вы можете использовать XSL-код следующим образом:

Здесь мы сравниваем атрибут context- node fn (из результатов preceding::* node -set) с атрибутом current- node fn . (Вы действительно не должны говорить ./@fn , вы можете просто сказать @fn .)

Итак, контекст node оставляет вас внутри предиката XPath; текущий node выходит за пределы предиката, обратно к node, обрабатываемому текущим шаблоном.

XPath примеры — шпаргалка для разбора страниц

Примеры использования xpath из практики парсинга информации с сайтов. Приведены участки кода xpath.

Получить текст заголовока h1

Получить текст заголовока с классом produnctName

Получить значение определенного span по классу

Получить значение атрибута title у кнопки с классом addtocart_button

Текст ссылки

Получить url значение атрибута href ссылки

Изображение src

Изображение сразу за определенным элементом в DOM, ось following

Изображение в 4 div по счету

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML.

XML имеет древовидную структуру. У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков.

На каждом шаге пути отбираются элементы, соответствующие условиям отбора на этом шаге, и в результате обращения по пути к документу получается множество элементов, удовлетворяющих данному пути.

Функции над множествами узлов

  • * — обозначает любое имя или набор символов по указанной оси, например: * — любой дочерний узел; @* — любой атрибут.
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки или, что то же самое, предикат шага адресации. Должен содержать логическое значение. Если содержит числовое, считается что это порядковый номер узла, что эквивалентно приписыванию перед этим числом выражения «position()=»
  • <> — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева, то есть разделяет шаги адресации
  • | — объединяет результат. То есть, можно написать несколько путей разбора через знак | и в результат такого выражения войдёт всё, что будет найдено любым из этих путей.
  • node-set node()

Возвращает все узлы. Вместо этой функции часто используют заменитель ‘*’, но, в отличие от звездочки, функция node() возвращает и текстовые узлы.

Возвращает набор текстовых узлов;

  • node-set current()

Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция.

  • number position()
Илон Маск рекомендует:  Стилизация флажков

Возвращает позицию элемента в множестве. Корректно работает только в цикле

Возвращает номер последнего элемента в множестве. Корректно работает только в цикле

  • number count(node-set)

Возвращает количество элементов в node-set.

  • string name(node-set?)

Возвращает полное имя первого тега в множестве.

  • string namespace-uri(node-set?)

Возвращает ссылку на url определяющий пространство имён.

  • string local-name(node-set?)

Возвращает имя первого тега в множестве, без пространства имён.

  • node-set id(object)

Находит элемент с уникальным идентификатором

Оси — это база языка XPath. Для некоторых осей существуют сокращённые обозначения.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента. Это обращение можно заменить на «@»
  • child:: — Возвращает множество потомков на один уровень ниже. Это название сокращается полностью, то есть его можно вовсе опускать.
  • descendant:: — Возвращает полное множество потомков (то есть, как ближайших потомков, так и всех их потомков).
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент. Выражение «/descendant-or-self::node()/» можно сокращать до «//». С помощью этой оси, например, можно вторым шагом организовать отбор элементов с любого узла, а не только с корневого: достаточно первым шагом взять всех потомков корневого. Например, путь «//span» отберёт все узлы span документа, независимо от их положения в иерархии, взглянув как на имя корневого, так и на имена всех его дочерних элементов, на всю глубину их вложенности.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад. Это обращение можно заменить на «..»
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент. Это обращение можно заменить на «.»

XML и XPath

XPath – это язык для поиска информации внутри XML документа.

Что такое XPath?

  • XPath — специальный язык для определения частей XML документа
  • XPath использует маршрутные выражения для навигации по XML документам
  • XPath содержит библиотеку стандартных функций
  • XPath — главный элемент в XSLT
  • XPath также используется в XQuery, XPointer и XLink

Маршрутные выражения XPath

XPath использует маршрутные выражения для выбора узлов или узловых наборов в XML документе. Эти маршрутные выражения похожи на те выражения, которые можно увидеть при работе с традиционными файловыми системами.

В настоящее время выражения XPath можно использовать в JavaScript, Java, XML схемах, PHP, Python, C и C++, а также во множестве других языках программирования.

XPath используется в XSLT

XPath является главным составляющим элементом стандарта XSLT. Без знания XPath невозможно создавать документы XSLT.

Пример XPath

Для демонстрации XPath будем использовать следующий XML документ:

В приведенной ниже таблице представлены некоторые выражения XPath и результат их работы:

PHP XPath: Как получить контент и HTML-теги div?

Я пытаюсь очистить веб-страницу и хочу получить текст и все теги HTML внутри div тег.

Веб-страница выглядит так:

С помощью cURL мне удалось извлечь весь текст, но теги отсутствуют.

Решение

Это довольно просто:

Код выше возвращает:

И вот пример работоспособного: http://3v4l.org/9CYCs

Вот весь дочерний узел из div.class (он возвращает экземпляр DOMNodeList):

Заметка DOMNodeList это набор DOMElement объекты.

Связанные ссылки на документы:

Другие решения

Для сканирования я бы порекомендовал использовать php_query, ниже ссылка. Это обеспечивает jquery как селектор для страниц. HTML-страницы не являются необходимыми для надлежащего xml, если они не являются XHTML.

Используйте PHP, чтобы сделать это легко.

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

PHP DOM XPath — Get child elements AND self (using query with contextnode)

Using this XML for example.

. and getting an element for a contextnode (a contextnode is required)

. how can I get a nodelist containing any contextnode children and including self contextnode that attribute «is» is equal to «mine»? For example: I just want to get the tag1 and tag3 elements (tag1 is the contextnode)

In this case, only tag3 (child) is available on the nodelist.

In this case, tag1 (contextnode), tag3 (child) and tag2 (sibling) is available on the nodelist.

NamespaceContext и использование пространств имен в XPath

разрешение xpath, который включает пространства имен в Java, по-видимому, требует использования NamespaceContext object, отображение префиксов в URL-адреса пространства имен и наоборот. Однако я не могу найти механизма для получения NamespaceContext кроме реализации его самостоятельно. Это кажется противоречащим интуиции.

Илон Маск рекомендует:  Что такое код odbc_tableprivileges

вопрос: есть ли простой способ приобрести NamespaceContext из документа, или создать его, или в противном случае отказаться от префиксов вообще и указать xpath с полностью полные имена?

5 ответов

можно сделать NamespaceContext экземпляр без написания собственного класса. Его class-use страница показывает, что вы можете получить один, используя javax.XML.поток пакета.

отказ от префиксов в целом, вероятно, приведет к неоднозначным выражениям — если вы хотите удалить префиксы пространства имен, вам нужно будет изменить формат документа. Создание контекста из документа не обязательно имеет смысл. Префиксы должны соответствовать те, которые используются в выражении XPath, а не в любом документе, как в этом коде:

ни реализация, возвращенная API StAX, ни выше не реализуют полный класс/метод контракты, определенные в документе doc. Вы можете получить полную реализацию на основе карты здесь.

Я только что работал с использованием xpath и NamespaceContexts сам. Я наткнулся на хорошее отношение к вопросу на developerworks.

Я нашел удобную реализацию в «Apache WebServices Общие Утилиты » называется NamespaceContextImpl.

для получения этого класса можно использовать следующую зависимость maven:

Я использую его следующим образом (я знаю, что он построен для sax, но после прочтения кода его o.k):

вам не нужно вызывать endPrefixMapping.

Если вы используете Spring framework, вы можете повторно использовать их реализацию NamespaceContext org.springframework.util.xml.SimpleNamespaceContext

это аналогичный ответ, как и у Асаф Месика. Таким образом, он не дает вам автоматического NamespaceContext на основе вашего документа. Вы должны построить его сами. Тем не менее это помогает вам, потому что это, по крайней мере, дает вам реализацию для начала.

когда мы столкнулись с подобной проблемой, как весна SimpleNamespaceContext и » общие веб-службы Apache Коммунальные услуги » работали. Мы хотели избежать зависимости jar от Apache WebServices Common Utilities и использовали Spring, потому что наше приложение основано на Spring.

если вы используете — Джерси 2 и имеют только пространство имен XML по умолчанию ( xmlns=». » ), вы можете использовать SimpleNamespaceResolver:

вы также можете указать xmlns вручную, если вы хотите.

Как запросить XML с помощью пространств имен в Java с XPath?

когда мой XML выглядит так (нет xmlns ) тогда я могу легко запросить его с XPath, как /workbook/sheets/sheet[1]

но когда это выглядит так, то я не могу

6 ответов:

во втором примере XML-файла элементы привязаны к пространству имен. Ваш XPath пытается адресовать элементы, привязанные к пространству имен по умолчанию «no namespace», поэтому они не совпадают.

предпочтительным методом является регистрация пространства имен с префиксом пространства имен. Это делает ваш XPath намного проще в разработке, чтении и обслуживании.

однако не обязательно регистрировать пространство имен и использовать префикс пространства имен в вашем язык XPath.

вы можете сформулируйте выражение XPath, которое использует общее соответствие для элемента и фильтр предикатов, который ограничивает соответствие для желаемого local-name() и namespace-uri() . Например:

как вы можете видеть, он создает чрезвычайно длинное и подробное заявление XPath, которое очень трудно читать (и поддерживать).

вы также можете просто соответствовать на local-name() элемента и игнорировать пространства имен. Для пример:

однако вы рискуете сопоставить неправильные элементы. если ваш XML имеет смешанные словари (которые не могут быть проблемой для этого экземпляра), которые используют тот же local-name() , ваш XPath может совпадать с неправильными элементами и выбирать неправильное содержимое:

ваша проблема-это пространство имен по умолчанию. Ознакомьтесь с этой статьей о том, как работать с пространствами имен в вашем XPath:http://www.edankert.com/defaultnamespaces.html

один из выводов, который они делают:

Итак, чтобы иметь возможность использовать XPath выражения для содержимого XML, определенного в пространство имен (по умолчанию), нам нужно укажите сопоставление префикса пространства имен

обратите внимание, что это не значит, что вы должны изменить свой источник документ в любом случае (хотя вы можете поместить туда префиксы пространства имен, если хотите). Звучит странно, правда? Что ты будет do-это создание сопоставления префиксов пространства имен в коде java и использование указанного префикса в выражении XPath. Здесь мы создадим отображение из spreadsheet в пространстве имен по умолчанию.

и вуаля. Теперь у вас есть свой элемент, сохраненный в result переменной.

предостережение: если вы анализируете свой XML как DOM со стандартными классами JAXP, обязательно вызовите setNamespaceAware(true) на DocumentBuilderFactory . В противном случае, этот код не будет работать!

все пространства имен, которые вы собираетесь выбрать в исходном XML, должны быть связаны с префиксом на языке хоста. В Java / JAXP это делается путем указания URI для каждого префикса пространства имен с помощью экземпляра javax.xml.namespace.NamespaceContext . К сожалению, есть нет реализации на NamespaceContext предусмотрено в SDK.

к счастью, это очень легко написать собственное:

используйте его так:

обратите внимание, что даже если первый пространство имен не указывает префикс в исходном документе (т. е. это пространство имен по умолчанию)вы должны связать его с префиксом в любом случае. Затем ваше выражение должно ссылаться на узлы в этом пространстве имен с помощью выбранного префикса, например:

Илон Маск рекомендует:  Можно ли обратиться к колонке или строке grid'а по заголовку

имена префиксов, которые вы хотите связать с каждым пространством имен, являются произвольными; они не должны соответствовать тому, что появляется в исходном XML. это сопоставление-это всего лишь способ говорить Механизм XPath, который заданное имя префикса в выражении коррелирует с определенным пространством имен в исходном документе.

context node в XPath

contextNode: A node in the document against which the xpathExpression should be evaluated, including any and all of its child nodes. The document node is the most commonly used.

Как я понял из вышенаписанного, поиск должен проводиться в контексте contextNode, но реально задание contextNode не отражается на результатах поиска.
Я не верно понял значение contextNode или причина в чем-то другом? Как решить с помощью XPath поставленную задачу? Заранее благодарен за ответ.

Прикрепил тестовый файл воспроизводящий проблему (необходимо получить потомки элемента «rootdiv», начиная с child-a «start»), вот его код:

PHP XPath: Как получить контент и HTML-теги div?

Я пытаюсь очистить веб-страницу и хочу получить текст и все теги HTML внутри div тег.

Веб-страница выглядит так:

С помощью cURL мне удалось извлечь весь текст, но теги отсутствуют.

Решение

Это довольно просто:

Код выше возвращает:

И вот пример работоспособного: http://3v4l.org/9CYCs

Вот весь дочерний узел из div.class (он возвращает экземпляр DOMNodeList):

Заметка DOMNodeList это набор DOMElement объекты.

Связанные ссылки на документы:

Другие решения

Для сканирования я бы порекомендовал использовать php_query, ниже ссылка. Это обеспечивает jquery как селектор для страниц. HTML-страницы не являются необходимыми для надлежащего xml, если они не являются XHTML.

Используйте PHP, чтобы сделать это легко.

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

Understanding XPath Processor Terms

To use the context operators, it is important to understand the following terms:

An axis specifies a list of nodes in relation to the context node. For example, the ancestor axis contains the ancestor nodes of the context node. The child axis contains the immediate children of the context node. See Syntax for Specifying an Axis in a Query.

Context Node

A context node is the node the XPath processor is currently looking at. The context node changes as the XPath processor evaluates a query. If you pass a document to the XPath processor, the root node is the initial context node. If you pass a node to the XPath processor, the node that you pass is the initial context node. During evaluation of a query, the initial context node is also the current node.

Context Node Set

A context node set is a set of nodes that the XPath processor evaluates.

Current Node

Current node is the node that the XPath processor is looking at when it begins evaluation of a query. In other words, the current node is the first context node that the XPath processor uses when it starts to execute the query. During evaluation of a query, the current node does not change. If you pass a document to the XPath processor, the root node is the current node. If you pass a node to the XPath processor, that node is the current node.

Document Element

The document element is the element in a document that contains all other elements. The document element is an immediate child of the root node. When you obtain the document element of a document, you obtain all marked-up text in that document.

Filter

A filter in a query specifies a restriction on the set of nodes to be returned. For example, the filter in the following query restricts the result set to book elements that contain at least one excerpt element:

Location Path Expression

A location path expression is an XPath expression. It has the following format:

Location Step

An XPath expression consists of one or more location steps. A location step has the following format:

Node Test

You apply a node test to a list of nodes. A node test returns nodes of a particular type or nodes with a particular name. For example, a node test might return all comment nodes, or all book elements.

Root Node

The root node is the root of the tree. It does not occur anywhere else in the tree. The document element node for a document is a child of the root node. The root node also has as children processing instructions and comment nodes representing processing instructions and comments that occur in the prolog and after the end of the document element.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL