Как вы используете опцию --pattern в xmllint? - PullRequest
14 голосов
/ 08 февраля 2010

Я пытаюсь увидеть, как libxml реализует поддержку XPath, поэтому для меня имеет смысл протестировать с использованием xmllint Однако очевидная опция, --pattern, несколько неясна, и в итоге я использовал что-то вроде следующего:

test.xml: <foo><bar/><bar/></foo>

> xmllint --shell test.xml
/  > dir /foo
ELEMENT foo
/  > dir /foo/*
ELEMENT bar
ELEMENT bar

Кажется, это работает, и это здорово, но мне все еще интересно. Для чего нужна опция --pattern в xmllint и как она работает?

Приведите пример полного кредита. =)

Ответы [ 4 ]

20 голосов
/ 10 марта 2011

На первый взгляд недокументированная опция --xpath представляется более полезной.

% cat data.xml
<project>
  <name>
    bob
  </name>
  <version>
    1.1.1
  </version>
</project>
% xmllint --xpath '/project/version/text()' data.xml | xargs -i echo -n "{}"
1.1.1
% xmllint --xpath '/project/name/text()' data.xml | xargs -i echo -n "{}"
bob
7 голосов
/ 02 мая 2012

Подсказка в словах "которые могут использоваться с интерфейсом считывателя для анализатора": xmllint использует интерфейс считывателя только при передаче параметра --stream:

$ xmllint --stream --pattern /foo/bar test.xml
Node /foo/bar[1] matches pattern /foo/bar
Node /foo/bar matches pattern /foo/bar
3 голосов
/ 22 июля 2013

Если вы просто хотите получить текстовое значение для ряда узлов xml, вы можете использовать что-то вроде этого (если --xpath недоступен в вашей версии xmllint):

./foo.xml:

<hello>
   <world>its alive!!</world>
   <world>and works!!</world>
</hello>

$ xmllint --stream --pattern /hello/world --debug ./foo.xml | grep -A 1 "matches pattern" | grep "#text" | sed 's/.* [0-9] //'
its alive!!
and works!!
3 голосов
/ 13 февраля 2010

со страницы руководства xmllint (1):

   --pattern PATTERNVALUE
          Used to exercise the pattern recognition engine, which can be
          used with the reader interface to the parser. It allows to
          select some nodes in the document based on an XPath (subset)
          expression. Used for debugging.

Он понимает только подмножество XPath, и его целью является помощь в отладке. Библиотека, которая полностью понимает XPath, - это libxslt (3) и инструмент командной строки xsltproc (1).

Модуль `` pattern '' в libxml "позволяет компилировать и тестировать выражения шаблона для узлов либо в дереве, либо на основе состояния анализатора", и его документация находится здесь: http://xmlsoft.org/html/libxml-pattern.html

Ари.

...