Я не очень знаком с regex, sed и т. Д., И немного ленив, чтобы понять это прямо сейчас, так как мне извлечь эту строку:
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
Дайте мне знать, если больше структуры XML требуется.
Так как входные данные (Ваш 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/
Корректный ответ, как 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 давайте повредим его в три части:
.*
соответствия с начала строки вплоть до второй части
Эта часть, sunset="([^"]*)"
, соответствует символам sunset="
, сопровождаемый любым количеством символов кроме "
, сопровождаемый закрытием "
. Выражение [^"]
средства любой символ кроме "
и [^"]*
средства любое количество таких символов. parens, (...)
, получает символы в "..."
в группу 1 sed, который мы более поздняя ссылка как \1
.
.*
соответствия все символы после выражения заката.
Вы не используете regex или sed. Вы используете синтаксический анализатор XML и язык запросов XML (XPath или XQuery). И я боюсь, что детали действительно зависят от контекста: например, "yweather" является кратким названием (префикс) для пространства имен, и необходимо знать, какое пространство имен это представляет.
Я дам тот же ответ 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
для чтения свойства этого.