Использование objectify для получения элементов с другим префиксом пространства имен

#python #xml #lxml #objectify

#python #xml #lxml #objectify

Вопрос:

 <?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
    <content type="html">Hello World!</content>
    <dd:country_code>USA</dd:country_code>
</entry>
  

Я хотел бы использовать lxml.objectify для доступа как к ‘Hello World!’, так и к ‘USA’. Как это можно сделать? Меня не волнует эффективность, просто экономность. Я перепробовал все, что мог придумать, но безрезультатно.

Ответ №1:

С помощью этой настройки:

 import lxml.objectify as objectify
import io

content='''
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
    <content type="html">Hello World!</content>
    <dd:country_code>USA</dd:country_code>
</entry>
</feed>'''

doc=objectify.parse(io.BytesIO(content))
tree=doc.getroot()
  

Короткий и быстрый способ:

 print(list(tree.entry.iterchildren()))
# ['Hello World!', 'USA']
  

Или более конкретный способ:

 print(tree.entry["content"])
# Hello World!
  

для обработки пространств имен:

 print(tree.entry["{http://example.com/ns/1.0}country_code"])
# USA
  

Этот метод доступа к пространствам имен задокументирован здесь.