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