簡體   English   中英

XML在python中解析為數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM