如何使用多个相同的标签解析Bash中的XML文件

时间:2016-08-07 04:09:26

标签: xml bash openhab

我已经阅读了这个答案:https://stackoverflow.com/a/7052168/6557127,但我的XML文件有点不同(openHAB REST API):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
 <item>
    <type>GroupItem</type>
    <name>All</name>
    <state>baz</state>
    <link>http://localhost:8080/rest/items/All</link>
 </item>
 <item>
    <type>GroupItem</type>
    <name>foo</name>
    <state>bar</state>
    <link>http://localhost:8080/rest/items/foo</link>
 </item>
</items>

如何在bash中获取项目foo的状态?

1 个答案:

答案 0 :(得分:1)

使用XMLStarlet

xmlstarlet sel -t -m "//item[name='foo']/state" -v .

...或者,使用Python 2.7(这里,从shell函数调用):

get_state() {
  python -c '
import xml.etree.ElementTree as ET
import sys

doc = ET.parse(sys.stdin)
el = doc.find(".//item[name=\"%s\"]/state" % (sys.argv[1],))
if el is not None:
    print el.text
' "$@"
}

...用作:

foo_state=$(get_state foo <your.xml)

在任何一种情况下,我们都使用真正的XML解析器(而不是试图破解一起并没有真正理解语法的东西),并利用XPath语言构建我们的实际查询。