使用命名空间解析XML时出现问题

时间:2010-09-03 09:18:18

标签: python xml parsing lxml xml-parsing

嗨我有想要解析的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 个答案:

答案 0 :(得分:3)

有关lxml.etree如何处理命名空间的说明,请参阅here。一般来说,你应该与他们合作而不是试图避免他们。在这种情况下,请写:

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'):