2016-08-07 2 views
0

Я прочитал этот ответ: https://stackoverflow.com/a/7052168/6557127, но мой файл XML немного отличается (openHAB REST API):Как разобрать XML-файл в Bash с несколькими одинаковыми метками

<?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?

+0

BTW - если есть какие-либо 'xmlns =' объявления вверх заголовком вашего документа, что изменяет семантику; обязательно включите их. –

ответ

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 
' "[email protected]" 
} 

... используется как:

foo_state=$(get_state foo <your.xml) 

В любом случае, мы являемся usin g реальный синтаксический анализатор XML (вместо того, чтобы пытаться взломать что-то вместе, а не действительно понять синтаксис) и использовать язык XPath для построения нашего фактического запроса.

+0

Могу ли я напрямую использовать веб-страницу, не загружая ее? Я не хочу, чтобы так много писем на SD-карте pi – Motte001

+0

'foo_state = $ (curl http: // ... | get_state foo)' –

+0

При этом вам, вероятно, нужно иметь shmfs (или другую память) для '/ tmp', если это вас беспокоит. –

Смежные вопросы