使用XPATH的Linux Bash XMLLINT

今天我学习如何正确使用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文件中提取数据值。 例如,我想从index.php项目获取DESCRIPTION的值。

我正在使用

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

为不同的布局工作,但现在我改变了我的XML文件的布局,我失去了如何最好地针对特定的<item> ,然后深入到其在bash脚本中的子元素。

有人可以帮助一个xmllint --xpath行来获取这个值吗?

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

正确的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输出任何东西。 将输出重定向到一个文件。

 $ cat result.txt DESCRIPTION 

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

 xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml 

几分钟前我有同样的问题,看到这个帖子。

黑客一点点后,我发现以下解决方案提取城市:

 (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,然后只返回节点值。