繁体   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