Использование lxml и path для разбора xml, но получить пустой список, если в нем есть объявления xmlns - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть XML-файл, который мне нужен для анализа значения тега. XPATH для элемента "//provider". Как бы я использовал lxml для анализа этого тега? Это начало xml:

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://...">
    <provider>testmovieprovider</provider>
    <language>ja-JP</language>
    <!-- more stuff -->
</package>

Вот что я пробовал:

>>> f = open(file)
>>> xml = f.read()
>>> node = etree.fromstring(xml)
>>> provider=node.xpath('//provider')
>>> provider
[] # (This returns an empty set, instead of the provider name, 'testmovieprovider'.)

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Попробуйте XPath вот так:

/*/*[local-name()='provider']

3 голосов
/ 10 февраля 2012

Попробуйте xpath с xml namespace

Я добавил пространство имен xmlns="http://codespeak.net/ns/test1"

и затем использовал следующий код

>>> xml_node = etree.fromstring(st)
>>> xml_node.xpath('//t:provider/text()',namespaces={'t': 'http://codespeak.net/ns/test1'})
['testmovieprovider']
>>>

Моя st строка

'<?xml version="1.0" encoding="UTF-8"?>
 <package xmlns="http://codespeak.net/ns/test1">
 <provider>testmovieprovider</provider>
 <language>ja-JP</language>
 <!-- more stuff -->
 </package>'
...