Как извлечь один атрибут из файла 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
Чтобы понять регулярное выражение, давайте разберем его на три части:
.*
совпадает с начала строки до второй частиЭта часть,
sunset="([^"]*)"
соответствует персонажамsunset="
с последующим любым количеством символов, кроме"
с последующим закрытием"
, Выражение[^"]
означает любой символ кроме"
а также[^"]*
означает любое количество таких символов. Паренс,(...)
, захватывает символы внутри"..."
в группу Седа 1, которую мы позже будем называть\1
,.*
соответствует всем символам после выражения заката.
Я дам тот же ответ Джереми Керр, но дать ему 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
читать свойство этого.