22

今天我开始学习如何正确使用 xmllint。它似乎没有得到很好的覆盖或解释。我计划使用单一语言资源文件来运行我的整个系统。我混合了必须从此语言文件读取的 bash 脚本和 php 页面。

目前我在我的 xml 文件 en.xml 中使用以下格式:

<?xml version="1.0" encoding="utf-8"?>
<resources>

   <item id="index.php">
        <label>LABEL</label>
        <value>VALUE</value>
        <description>DESCRIPTION</description>
   </item>
   <item id="config.php">
        <label>LABEL</label>
        <value>VALUE</value>
        <description>DESCRIPTION</description>
   </item>

</resources>

现在我需要从一个 bash 脚本行开始,它应该从 xml 文件中提取数据值。例如,我想DESCRIPTIONindex.phpitem 中获取 value。

我正在使用

xmllint --xpath 'string(//description)' /path/en.xml

对于有效的不同布局,但是现在我正在更改 xml 文件的布局,我不知道如何最好地定位特定的目标<item>,然后在 bash 脚本中深入到它的子元素。

有人可以帮忙用一条xmllint --xpath线来获得这个值吗?

4

3 回答 3

29

如何最好地定位特定元素,然后深入到其子元素

执行此操作的正确 XPath 表达式是:

/resources/item[@id="index.php"]/description/text()

用简单的英语:从文档节点开始,到文档元素resources,再到它的子元素,item但前提是id属性的值为“index.php”,然后再到它的子元素description并检索其文本值。

我使用 xmllint 来验证 XML 文档,但从不用于路径表达式。在 bash shell(至少在 Mac OS 中)中,有一个更简单的工具用于评估 XPath 表达式,称为“xpath”:

$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'

然后,得到以下结果:

Found 1 nodes:
-- NODE --
DESCRIPTION

如果您仍然喜欢 xmllint,请按以下方式使用它:

$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt

默认情况下,--xpath暗示--noout,这会阻止 xmllint 输出输入 XML 文件。为了使输出更具可读性,我将输出重定向到一个文件。

$ cat result.txt 
DESCRIPTION
于 2014-11-03T07:41:00.917 回答
2

我最喜欢的是xmlstarlet因为它似乎比 xmllint 更强大

xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
于 2017-03-12T04:36:29.587 回答
0

几分钟前我遇到了同样的问题,并看到了这篇文章。

经过一番破解后,我找到了以下提取城市的解决方案:

(
wget 'http://maps.googleapis.com/maps/api/geocode/xml?latlng=53.244921,-2.479539&sensor=true' \
  -O dummy.xml -o /dev/null
xmllint --format \
  --xpath '/GeocodeResponse/result[type = "postal_town"]/address_component[type = "postal_town"]/short_name/node()' \
  dummy.xml
)

您需要指定正确的 X-Path 以获得所需的 XML-Tag,然后只返回节点值。

于 2015-09-05T21:34:50.923 回答