Хороший 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> 

  • Как я могу получить доступ к XML-элементам с именами, используя BeautifulSoup?
  • Python lxml iterfind w / namespace, но prefix = None
  • Python: игнорировать xmlns в elementtree.ElementTree
  • Как я могу удалить пространства имен из дерева lxml?
  • Использование owl: префикс класса с сериализацией rdflib и xml
  • Как использовать пространства имен xml с find / findall в lxml?
  • Python xpath не работает?
  • python lxml findall с несколькими пространствами имен
  • 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.

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