无法使用xts:前缀解析XML中的属性

时间:2014-08-14 00:29:14

标签: python xml

我运行了一个python脚本来使用ElementTree库解析XML文档。我能够解析所有数据,包括属性数据,但是有一些属性有“xts:”作为前缀。

所以:

var1 = child.attrib['abc']
var2 = child.attrib['xts:xyz']

当我运行脚本时,它能够收集“abc”属性数据,但“xts:xyz”属性数据为空,尽管存在与该属性相关联的内容。

听起来不像“:”是我需要逃避的Python中的特殊字符。有任何想法吗?

1 个答案:

答案 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}直接访问它如上所述,下标。