今天我学习如何正确使用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,然后只返回节点值。