Проблема синтаксического анализа XML с пространствами имен - PullRequest
2 голосов
/ 03 сентября 2010

привет, у меня есть 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 голосов
/ 03 сентября 2010

См. здесь для объяснения того, как 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'):
...