我不太熟悉正则表达式、sed 等,而且现在有点懒得去弄清楚,所以我该如何提取这一行:
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
如果需要更多的 xml 结构,请告诉我。
答案1
由于输入数据(您的 XML 文件)是结构化的,因此最好对该结构化数据使用查询,而不是将其视为纯文本并使用正则表达式。
我们可以用来xmllint --xpath
评估 xml 输入上的 XPath 表达式:
$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am
- 这有点复杂,因为我们必须处理该文件中的不同命名空间,但仍然可以起作用。
有关 XPath 的更多信息,请参见规范http://www.w3.org/TR/xpath/
答案2
您不使用正则表达式或 sed。您使用 XML 解析器和 XML 查询语言(XPath 或 XQuery)。恐怕细节确实取决于上下文:例如,“yweather”是命名空间的简称(前缀),您需要知道它代表什么命名空间。
答案3
正如 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
为了理解正则表达式,我们将其分为三个部分:
.*
从行首到第二部分的匹配此部分
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
读取其属性。