2014-11-03 2 views
4

Сегодня я узнаю, как правильно использовать xmllint. Похоже, что это недостаточно хорошо описано или объяснено. Я планирую использовать файл с одним языковым ресурсом для запуска всей моей системы. У меня есть смесь скриптов bash и php-страниц, которые должны читать из этого языкового файла.Linux Bash XMLLINT с XPATH

В настоящее время я использую следующий формат в моем 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> 

Теперь мне нужно начать с линией Баша скрипта, который должен тянуть значение данных из файла XML. Например, я хочу получить значение DESCRIPTION из пункта index.php.

Я использовал

xmllint --xpath 'string(//description)' /path/en.xml 

для другого макета, который работал, но теперь, когда я меняю расположение моего файла XML, я теряется, как лучше для нацеливания на определенную <item>, а затем развернуть его дочернему элементу в сценарии bash.

Может кто-нибудь помочь с помощью линии xmllint --xpath, чтобы получить это значение, пожалуйста?

ответ

6

как лучше целевой конкретный, а затем перейти к его дочернему элементу

правильное выражение XPath, чтобы сделать это:

/resources/item[@id="index.php"]/description/text() 

обиняков: Старт из документа узел, к элементу документа resources, к его дочернему элементу item, но только если значение атрибута id является «index.php», его дочернему элементу description и получить его текстовое v ALUE.

Я использую xmllint для проверки XML-документов, но не для выражений пути. В Баш оболочки (по крайней мере, с 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 
+0

Это работает. Большое спасибо за ваше время и внимание – RootWannaBe

+0

Привет, в какой версии xmllint вы используете? У меня есть 'xmllint --version xmllint: using версия libxml 20626 скомпилировано с помощью: Threads Tree Output Push Reader Шаблоны Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Каталог XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug', который не работает, t имеет опцию ** - xpath ** –

+0

@ReddySK Результаты в моем ответе я получил с помощью 'xmllint: using libxml version 20902', но на самом деле это не сообщает о версии самого xmllint, но версия базовых библиотек (самое главное, libxml). Кажется, у вас есть проблема, описанная здесь: http://stackoverflow.com/q/11975862/1987598, но попытка заставить '--xpath' работать в xmllint не стоит проблем: xmllint - это в основном инструмент для проверки, а не для выражений XPath. Вместо этого используйте библиотеку XPath на языке программирования. –

0

У меня была та же проблема несколько минут назад и я увидел это сообщение.

После взлома немного я нашел следующее решение для извлечения города:

(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-Path, чтобы получить нужный XML-тег, а затем возвращать только значение узла.

1

Мой любимый xmlstarlet, потому что, кажется, более мощным, чем xmllint:

xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml 
+0

'xmlstarlet' кажется мощным инструментом, спасибо за указатель! –

+0

Другое секретное оружие командной строки, которое у меня для них: «xidel», потому что оно поддерживает xpath2.0 и xquery. Единственная слабость «xidel» заключается в том, что она не может читать из stdin и, следовательно, не работает с Unix-конвейером, как это делает xmlstarlet. Хотя xmlstarlet имеет меньшие возможности XML, но он получает компенсацию, потому что вы можете его транслировать. – ifelsemonkey

Смежные вопросы