解析带命名空间的XML时遇到的问题

2 投票
1 回答
1519 浏览
提问于 2025-04-16 03:39

你好,我有一个XML文件,我想要解析它,文件大概是这样的

<?xml version="1.0" encoding="utf-8"?>
<SHOP xmlns="http://www.w3.org/1999/xhtml" xmlns:php="http://php.net/xsl">
    <SHOPITEM>
        <ID>2332</ID>
        ...
    </SHOPITEM>
    <SHOPITEM>
        <ID>4433</ID>
        ...
    </SHOPITEM>
</SHOP>

我的解析代码是

from lxml import etree

ifile = open('sample-file.xml', 'r')
file_data = etree.parse(ifile)

for item in file_data.iter('SHOPITEM'):
   print item

但是只有当XML的容器看起来像这样的时候,项目才会被打印出来

<SHOP xmlns="http://www.w3.org/1999/xhtml" xmlns:php="http://php.net/xsl">

看起来像这样

<SHOP>

我该如何解析这个XML文档,而不需要担心这个容器的定义呢?

1 个回答

3

请查看这里,了解lxml.etree是如何处理命名空间的。一般来说,你应该使用命名空间,而不是试图避开它们。在这种情况下,你可以这样写:

for item in file_data.iter('{http://www.w3.org/1999/xhtml}SHOPITEM'):

如果你需要经常引用这个命名空间,可以设置一个本地变量:

xhtml_ns = '{http://www.w3.org/1999/xhtml}'
...
for item in file_data.iter(xhtml_ns + 'SHOPITEM'):

撰写回答