如何从 XML 文件中提取单个属性?

如何从 XML 文件中提取单个属性?

我不太熟悉正则表达式、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

为了理解正则表达式,我们将其分为三个部分:

  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读取其属性。

相关内容