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

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

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

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

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/

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

Правильный ответ, как говорит Майкл Кей, - использовать инструмент, специфичный для XML.

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

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

Чтобы извлечь время заката:

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

Чтобы понять регулярное выражение, давайте разберем его на три части:

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

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

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

Я дам тот же ответ Джереми Керр, но дать ему 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 читать свойство этого.

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