2016-08-07 3 views
0

여러 같은 레이블 배쉬에서 XML 파일을 구문 분석 : 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 항목? (쉘 함수 호출 여기서,) 파이썬 2.7

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

... 또는 : XMLStarlet 함께

+0

BTW - 문서 머리글에'xmlns ='선언이 있으면 의미가 변경됩니다. 반드시 포함 시키십시오. –

답변

1

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) 

두 경우 모두 우리는 g 실제 XML 파서 (이 실제로이 아닌 구문을 이해하지 못하도록 함께 해킹하려는 것보다는)를 사용하고 실제 쿼리를 구성하는 데 XPath 언어를 사용합니다.

+0

웹 페이지를 다운로드하지 않고 바로 사용할 수 있습니까? 파이의 SD 카드에 이렇게 많은 글을 쓰고 싶지는 않다. – Motte001

+0

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

+0

그런데 shmfs (또는 다른 메모리 지원) 파일 시스템을'/ tmp' 파일에 담아 두는 것이 좋습니다. –