2016-01-05 3 views
0

В командной строке bash я хочу запустить xmllint для получения данных из XML-файла. Давайте посмотрим на файл, в котором я не имею никаких проблем:xmllint - невозможно прочитать специальные символы

Созерцайте fruits.xml файла:

 <?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="mykey">grapes</string> 
</map> 

и это мне с помощью xmllint, чтобы получить значение «виноград» от fruits.xml

xmllint --xpath "string(/map/string[@name = 'mykey'])" fruits.xml 

и я получить выход из следующих действий:

$ grapes 

большой я получил значение, но это не т он фактический ключ, который мне нужно использовать. «MyKey» должно быть «c1: fruits_id-% 1 $ s»

теперь, когда я изменить «MYKEY» значение в файле fruits.xml к другому значению я не могу получить какое-либо значение, возвращаемое из xmllint:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="c1:fruits_id-%1$s">grapes</string> 
</map> 


xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruits.xml 

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

+1

Возможно, ваша оболочка заменяет '$ s' чем-то другим (например, ничего)? – Biffen

+0

Бинго вы его получили. Я должен был сделать \ $ s, чтобы заставить его работать. отправьте официальный ответ, если хотите. – j2emanue

ответ

1

(документ XML вы показываете не имеет c1: перед значением атрибута - опечатка, я думаю?)

Если вы используете $ в команде оболочки, оно интерпретируется как переменная и переменная интерполяция срабатывает. Поскольку переменная не существует, она заменяется ничем. Вы можете проверить это, изменив XML-документ

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="c1:fruits_id-%1">grapes</string> 
</map> 

Единственное изменение состоит в том, что два символа $s удаляются. Теперь выражение пути находит строку:

$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruit.xml 
grapes 

Либо бежать характер, как \$, как Biffen уже предложил:

$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1\$s'])" fruit.xml 
grapes 

или, столь же легко, поменять местами цитаты:

$ xmllint --xpath 'string(/map/string[@name = "c1:fruits_id-%1$s"])' fruit.xml 
grapes 

Нет никакой переменной интерполяции для строк, которые ограничены одинарными кавычками, даже если внутри них есть двойные кавычки (см. this question).

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