Linux Bash XMLLINT с XPATH
сегодня я узнаю, как правильно использовать xmllint. Это не кажется хорошо освещенным или объясненным. Я планирую использовать один файл ресурсов языка для запуска всей моей системы. У меня есть смесь скриптов bash и страниц php, которые должны читать из этого языкового файла.
в настоящее время я использую следующий формат в моем xml-файле en.XML-код:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item id="index.php">
<label>LABEL</label>
<value>VALUE</value>
<description>DESCRIPTION</description>
</item>
<item id="config.php">
<label>LABEL</label>
<value>VALUE</value>
<description>DESCRIPTION</description>
</item>
</resources>
теперь мне нужно начать с строки сценария bash, которая должна вытащить значения данных из xml-файла. Например я хочу чтобы получить значение DESCRIPTION
С index.php
товар.
Я был с помощью
xmllint --xpath 'string(//description)' /path/en.xml
для другого макета, который работал, но теперь, когда я меняю макет моего xml-файла, я теряюсь в том, как лучше всего ориентироваться на конкретный <item>
а затем перейдите к его дочернему элементу в сценарии bash.
может кто-нибудь поможет с xmllint --xpath
line, чтобы получить это значение, пожалуйста?
3 ответов
как лучше всего нацелиться на конкретный, а затем перейти к его дочернему элементу
правильное выражение XPath для этого:
/resources/item[@id="index.php"]/description/text()
на простом английском языке: начните с узла документа, к элементу документа resources
, на ее ребенка item
, но только если значение id
атрибут " индекс.php", по своему ребенку description
и получить его текстовое значение.
я использую xmllint для проверки XML-документов, но не для выражений пути. В оболочке bash (по крайней мере, с Mac OS) есть еще более простой инструмент для оценки выражений XPath, называемый "xpath":
$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'
тогда получается следующий результат:
Found 1 nodes:
-- NODE --
DESCRIPTION
если вы все еще предпочитаете xmllint, используйте его следующим образом:
$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt
по умолчанию --xpath
подразумевает --noout
, что предотвращает вывод xmllint. Перенаправить вывод в файл.
$ cat result.txt
DESCRIPTION
мой любимый xmlstarlet, потому что он кажется более мощным, чем xmllint:
xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
У меня была та же проблема несколько минут назад и увидел этот пост.
после взлома немного я нашел следующее решение для извлечения городе:
(wget 'http://maps.googleapis.com/maps/api/geocode/xml?latlng=53.244921,-2.479539&sensor=true' -O dummy.xml -o /dev/null;xmllint --format --xpath '/GeocodeResponse/result[type = "postal_town"]/address_component[type = "postal_town"]/short_name/node()' dummy.xml)
вы должны указать правильный X-путь, чтобы получить желаемый XML-тег, а затем вернуть только значение узла.