我正在使用 python 和 ElementTree 读取 XML,并且正在努力处理 xmlns 和 xsi 标签。
我的 XML 顶部如下所示。
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="website"?>
<SurveyGroup xmlns:xsi="website2" xmlns:xsd="website3" xsi:schemaLocation="website4 website5" xmlns="website6">
<Survey>
<Header>
我遵循 ET 流程
tree = ET.parse(xmlfile)
root = tree.getroot()
问题是 xlmns 或 xsi 数据似乎与此相关。我无法访问作为该根的子元素的元素,如果我打印 root 我得到
<Element '{website}SurveyGroup' at 0x00000278FCC85120>
如果我将行更改为
<SurveyGroup>
,我就不会遇到这个问题。
XML 文档中的所有元素都存在于特定的命名空间中——要么应用特定的前缀(如
xsi:schemaLocation
),要么对于没有命名空间前缀的元素,使用默认的 website6
命名空间(由 xmlns=website6
设置)
注释)。
如果要查找该文档中的元素,则需要指定适当的命名空间。有几种方法可以做到这一点。您可以将名称空间直接包含在大括号中,如下所示:
>>> doc.findall('{website6}Survey')
[<Element '{website6}Survey' at 0x7f02b45699e0>]
您还可以通过命名空间前缀引用命名空间:
>>> namespaces={'foo': 'website6'}
>>> doc.findall('foo:Survey', namespaces=namespaces)
[<Element '{website6}Survey' at 0x7f02b45699e0>]
在这里,我们将前缀
foo
映射到 website6
命名空间,因此我们可以在元素名称上使用 foo:
前缀。
您可以通过使用空键向
namespaces
字典添加条目来在查询中设置默认命名空间:
>>> namespaces={'': 'website6'}
>>> doc.findall('Survey', namespaces=namespaces)
[<Element '{website6}Survey' at 0x7f02b45699e0>]