我运行了一个python脚本来使用ElementTree库解析XML文档。我能够解析所有数据,包括属性数据,但是有一些属性有“xts:”作为前缀。
所以:
var1 = child.attrib['abc']
var2 = child.attrib['xts:xyz']
当我运行脚本时,它能够收集“abc”属性数据,但“xts:xyz”属性数据为空,尽管存在与该属性相关联的内容。
听起来不像“:”是我需要逃避的Python中的特殊字符。有任何想法吗?
答案 0 :(得分:1)
此处的问题是xts
是名称空间。没有必要逃避它,但是使用 ElementTree ,有必要告诉它关于命名空间以使其正常工作。
例如,此代码(在findall
中使用 XPath 语法):
import xml.etree.ElementTree as ET
xmlStr = """<?xml version="1.0" encoding="UTF-8"?>
<stuff xmlns:xts="http://www.stackoverflow.com">
<abc foo="bar">Baz</abc>
<xts:xyz narf="poit">troz</xts:xyz>
</stuff>
"""
namespaces = {"xts": "http://www.stackoverflow.com"}
root = ET.fromstring(xmlStr)
abcNode = root.findall("./abc", namespaces=namespaces)
xyzNode = root.findall("./xts:xyz", namespaces=namespaces)
产生这些结果:
>>> print abcNode[0].attrib
{'foo': 'bar'}
>>> print xyzNode[0].attrib
{'narf': 'poit'}
有关使用ElementTree解析名称空间的更多讨论/详细信息,您可以参考Parsing XML with namespace in Python via 'ElementTree'。
根据OP的评论进行编辑:
鉴于此代码(添加到import
的上述代码等),它反映了xyz
节点属性中的冒号:
xmlStr2 = """<?xml version="1.0" encoding="UTF-8"?>
<stuff>
<abc foo="bar">Baz</abc>
<xyz narf="xts:poit">troz</xyz>
</stuff>
"""
root2 = ET.fromstring(xmlStr2)
abcNode2 = root2.findall("./abc")
xyzNode2 = root2.findall("./xyz")
print "abc2 attrib: {0}".format(abcNode2[0].attrib)
print "xyz2 attrib: {0}".format(xyzNode2[0].attrib)
这个净新产出:
abc2 attrib: {'foo': 'bar'}
xyz2 attrib: {'narf': 'xts:poit'}
所以 ElementTree 在解析包含冒号的属性时没有问题。
您在评论中提到:
我仍然得到一个关键错误,无论我是否使用xyzNode.attrib ['poit']或 xyzNode.attrib [ 'XTS:八邑']
我认为该问题的关键(至少在find
方面)是它返回的是Element
对象的列表(即使它只是一个单Element
),如下所示:
>>> print xyzNode2
[<Element 'xyz' at 0x7f59bed39150>]
因此,为了使用attrib
,您需要访问该列表中的元素。您可以使用for-in
循环遍历所有这些循环并相应地处理它们(或者在这种情况下是单个循环),或者如果您知道只有一个,则可以使用{{1}直接访问它如上所述,下标。