[英]XML parse into array in python
我有這樣的XML:
<?xml version="1.0" ?>
<iq id="123" to="test" type="result">
<query xmlns="jabber:iq:roster">
<item jid="foo" subscription="both"/>
<item jid="bar" subscription="both"/>
</query>
</iq>
我想將jid從項目解析為數組。 我以為這樣的事情會起作用
import xml.etree.ElementTree as ET
myarr = []
xml = '<?xml version="1.0" ?><iq id="123" to="test" type="result"><query xmlns="jabber:iq:roster"><item jid="foo" subscription="both"/><item jid="bar" subscription="both"/></query></iq>'
root = ET.fromstring(xml)
for item in root.findall('query'):
t = item.get('jid')
myarr.append(t)
print (t)
您需要處理名稱空間 。 一種選擇是將名稱空間粘貼到xpath表達式中:
for item in root.findall('.//{%(ns)s}query/{%(ns)s}item' % {'ns': 'jabber:iq:roster'}):
t = item.attrib.get('jid')
myarr.append(t)
print (t)
印刷品:
foo
bar
也可以看看:
我贊成@alecxe的方法,我將其標記為“處理名稱空間”。 這是最通用,最正確的方法。 不幸的是,名稱空間通常很丑陋,冗長,並且不必要地復雜化了XPath表達式。
對於許多簡單的情況,其中名稱空間是XML世界對über精度的渴望的產物,而不是真正必須的以標識文檔中的節點,使用更簡單的“消除名稱空間”替代方法可以進行更簡潔的搜索。 關鍵例程是:
def strip_namespaces(tree):
"""
Strip the namespaces from an ElementTree in order to make
processing easier. Adapted from @nonagon's answer
at http://stackoverflow.com/a/25920989/240490
"""
for el in tree.iter():
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1] # strip namespaces
for k, v in el.attrib.items():
if '}' in k:
newkey = k.split('}', 1)[1]
el.attrib[newkey] = v
del el.attrib[k]
return tree
然后,程序將像以前一樣繼續運行,但是不必擔心那些討厭的名稱空間:
root = ET.fromstring(xml)
strip_namespaces(root)
for item in root.findall('.//item'):
t = item.attrib.get('jid')
myarr.append(t)
print (t)
如果您嘗試修改ElementTree並重新發送XML,則此方法無效,但是,如果您只是嘗試解構並從樹中獲取數據,則效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.