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-тег, а затем вернуть только значение узла.