Хороший XML-парсер python для работы с тяжелыми документами пространства имен

Элемент PythonTree кажется непригодным для использования в пространствах имен. Каковы мои альтернативы? BeautifulSoup – довольно мусор с пространствами имен. Я не хочу их уничтожать.

Примеры того, как конкретная библиотека python получает элементы с именами и их коллекции, – все +1.

Редактировать: Не могли бы вы предоставить код для работы с реальным случаем в реальном мире, используя вашу библиотеку по выбору?

Как бы вы хотели получить строки «Break Line», «2.6» и список [«PYTHON», «XML», «XML-NAMESPACES»]

<?xml version="1.0" encoding="UTF-8"?> <zs:searchRetrieveResponse xmlns="http://unilexicon.com/vocabularies/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:lom="http://ltsc.ieee.org/xsd/LOM"> <zs:records> <zs:record> <zs:recordData> <srw_dc:dc xmlns:srw_dc="info:srw/schema/1/dc-schema"> <name>Line Break</name> <dc:title>Processing XML namespaces using Python</dc:title> <dc:description>How to get contents string from an element, how to get a collection in a list...</dc:description> <lom:metaMetadata> <lom:identifier> <lom:catalog>Python</lom:catalog> <lom:entry>2.6</lom:entry> </lom:identifier> </lom:metaMetadata> <lom:classification> <lom:taxonPath> <lom:taxon> <lom:id>PYTHON</lom:id> </lom:taxon> </lom:taxonPath> </lom:classification> <lom:classification> <lom:taxonPath> <lom:taxon> <lom:id>XML</lom:id> </lom:taxon> </lom:taxonPath> </lom:classification> <lom:classification> <lom:taxonPath> <lom:taxon> <lom:id>XML-NAMESPACES</lom:id> </lom:taxon> </lom:taxonPath> </lom:classification> </srw_dc:dc> </zs:recordData> </zs:record> <!-- ... more records ... --> </zs:records> </zs:searchRetrieveResponse> 

3 Solutions collect form web for “Хороший XML-парсер python для работы с тяжелыми документами пространства имен”

lxml – это пространство имен.

 >>> from lxml import etree >>> et = etree.XML("""<root xmlns="foo" xmlns:stuff="bar"><bar><stuff:baz /></bar></root>""") >>> etree.tostring(et, encoding=str) # encoding=str only needed in Python 3, to avoid getting bytes '<root xmlns="foo" xmlns:stuff="bar"><bar><stuff:baz/></bar></root>' >>> et.xpath("f:bar", namespaces={"b":"bar", "f": "foo"}) [<Element {foo}bar at ...>] 

Изменить: на вашем примере:

 from lxml import etree # remove the b prefix in Python 2 # needed in python 3 because # "Unicode strings with encoding declaration are not supported." et = etree.XML(b"""...""") ns = { 'lom': 'http://ltsc.ieee.org/xsd/LOM', 'zs': 'http://www.loc.gov/zing/srw/', 'dc': 'http://purl.org/dc/elements/1.1/', 'voc': 'http://www.schooletc.co.uk/vocabularies/', 'srw_dc': 'info:srw/schema/1/dc-schema' } # according to docs, .xpath returns always lists when querying for elements # .find returns one element, but only supports a subset of XPath record = et.xpath("zs:records/zs:record", namespaces=ns)[0] # in this example, we know there's only one record # but else, you should apply the following to all elements the above returns name = record.xpath("//voc:name", namespaces=ns)[0].text print("name:", name) lom_entry = record.xpath("zs:recordData/srw_dc:dc/" "lom:metaMetadata/lom:identifier/" "lom:entry", namespaces=ns)[0].text print('lom_entry:', lom_entry) lom_ids = [id.text for id in record.xpath("zs:recordData/srw_dc:dc/" "lom:classification/lom:taxonPath/" "lom:taxon/lom:id", namespaces=ns)] print("lom_ids:", lom_ids) 

Вывод:

 name: Frank Malina lom_entry: 2.6 lom_ids: ['PYTHON', 'XML', 'XML-NAMESPACES'] 

libxml (http://xmlsoft.org/) Лучшая, более быстрая библиотека для синтаксического анализа xml. Есть реализация для python.

    Interesting Posts

    Сохранение модуля imgproc для малины python

    Как заставить STATIC_URL работать во внешних JS-файлах (Django)

    Как перенаправить вывод регистратора в текстовый виджет PyQt

    Получите все числа, которые составляют число

    Прочитайте случайные строки из огромного файла CSV в Python

    Написание CSV из фляжной рамки

    Python CSV DictReader с данными UTF-8

    Почему input () дает ошибку, когда я просто нажимаю клавишу ввода?

    Как я могу использовать API-интерфейс Python для приложений Google App Engine с локальным сервером разработки, когда сервер привязан к определенному IP-адресу (а не локальному хосту)?

    Ошибка CSV Python: строка содержит NULL-байт

    Кросс-платформенный способ получения PID по имени процесса в python

    Вопросы преобразования UTF-8 latin-1, python django

    Пристрастная монета?

    Какие типы языков позволяют программировать создание имен переменных?

    HTTP-запрос Python с контролируемым упорядочением заголовков HTTP

    Python - лучший язык программирования в мире.