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