Как проанализировать XML-файл в Bash с несколькими одинаковыми метками

Я прочитал этот ответ: /questions/38093452/kak-razobrat-xml-v-bash/38093463#38093463, но мой 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>

Как я могу получить состояние элемента foo в bash?

1 ответ

Решение

С XMLStarlet:

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

... или с Python 2.7 (здесь вызывается из функции оболочки):

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 для создания нашего фактического запроса.

Другие вопросы по тегам