由于 xmlns 和 xsi,使用 ElementTree 读取 XML 时出现问题

问题描述 投票:0回答:1

我正在使用 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>
,我就不会遇到这个问题。

python xml elementtree
1个回答
0
投票

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>]
© www.soinside.com 2019 - 2024. All rights reserved.