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

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

Я не очень хорошо знаком с регулярными выражениями, sed и т. д. и немного ленив, чтобы разобраться в этом прямо сейчас. Так как же мне извлечь эту строку:

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

Дайте мне знать, если понадобится дополнительная информация о структуре XML.

решение1

Поскольку входные данные (ваш 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/

решение2

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

решение3

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

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

решение4

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

Связанный контент