如何解析 Bash 中具有多个相同标签的 XML 文件
How to parse a XML file in Bash with multiple same labels
我已阅读此答案:,但我的 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 的状态?
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 语言构建我们的实际查询。
我已阅读此答案:,但我的 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 的状态?
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 语言构建我们的实际查询。