Как извлечь один атрибут из файла XML?

Я не очень знаком с regex, sed и т. Д., И немного ленив, чтобы понять это прямо сейчас, так как мне извлечь эту строку:

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Дайте мне знать, если больше структуры XML требуется.

2
задан 24 March 2015 в 04:05

4 ответа

Так как входные данные (Ваш XML-файл) структурированы, Вы - более обеспеченное использование запроса на тех структурированных данных, вместо того, чтобы рассматривать его как простой текст и смешать с регулярными выражениями.

Мы можем использовать xmllint --xpath для оценки выражения XPath на входе xml:

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- это является немного замысловатым, поскольку мы должны иметь дело с различными пространствами имен в том файле, но работами, тем не менее.

Для получения дополнительной информации о XPath, спецификация в http://www.w3.org/TR/xpath/

5
ответ дан 24 March 2015 в 04:05

Корректный ответ, как Michael Kay говорит, должен использовать XML-определенный инструмент.

Для быстрого и грязного решения вот подход sed. Давайте запустимся с этого файла:

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Извлечь время заката:

$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm

Для понимания regex давайте повредим его в три части:

  1. .* соответствия с начала строки вплоть до второй части

  2. Эта часть, sunset="([^"]*)", соответствует символам sunset=", сопровождаемый любым количеством символов кроме ", сопровождаемый закрытием ". Выражение [^"] средства любой символ кроме " и [^"]* средства любое количество таких символов. parens, (...), получает символы в "..." в группу 1 sed, который мы более поздняя ссылка как \1.

  3. .* соответствия все символы после выражения заката.

2
ответ дан 24 March 2015 в 04:05

Вы не используете regex или sed. Вы используете синтаксический анализатор XML и язык запросов XML (XPath или XQuery). И я боюсь, что детали действительно зависят от контекста: например, "yweather" является кратким названием (префикс) для пространства имен, и необходимо знать, какое пространство имен это представляет.

3
ответ дан 24 March 2015 в 04:05

Я дам тот же ответ Jeremy Kerr , но предоставление его xml в примере.

у Нас есть XML-файл, названный config.xml в корневой папке, и мы хотим считать атрибут или свойство тега, позволить ей быть эти widget тег.

config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>AppName</name>
    <description>Description.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>

Мы хотим добраться android-versionCode значение свойства, мы вводим это в терминале:

xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml

Вывод:

16

Объяснение: мы используем /*[local-name()='widget'] для отображения эти widget тег, и затем @android-versionCode для чтения свойства этого.

0
ответ дан 5 October 2019 в 11:56

Другие вопросы по тегам:

Похожие вопросы: