Сведения о вопросе

Faridun

08:04, 4th August, 2020

Теги

python   xml   lxml    

Используя каталог XML с Python lxml?

Просмотров: 526   Ответов: 3

Есть ли способ, когда я анализирую документ XML с помощью lxml, чтобы проверить этот документ против его DTD с помощью внешнего файла каталога? Мне нужно уметь работать с фиксированными атрибутами, определенными в документе DTD.



  Сведения об ответе

nYU

00:04, 17th August, 2020

Вы можете добавить каталог в переменную среды XML_CATALOG_FILES :

os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'

Смотрите эту нить . Обратите внимание, что записи в XML_CATALOG_FILES разделены пробелом URLs. Вы можете использовать Python в pathname2url и urljoinfile: ) для создания URL из имени пути.


  Сведения об ответе

PIRLO

10:44, 18th August, 2020

Можете ли вы привести пример? Согласно документам проверки lxml, lxml может обрабатывать проверку DTD (указанную в документе XML doc или внешне в коде) и системные каталоги, которые охватывают большинство случаев, которые я могу придумать.

f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")


  Сведения об ответе

lool

15:09, 25th August, 2020

Похоже, что lxml не предоставляет эту функцию libxml2, греппинг источника только открывает некоторые #defines для обработки ошибок:

C:\Dev>grep -ir --include=*.px[id] catalog lxml-2.1.1/src | sed -r "s/\s+/ /g"
lxml-2.1.1/src/lxml/dtd.pxi: catalog.
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_FROM_CATALOG = 20 # The Catalog module
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_WAR_CATALOG_PI = 93 # 93
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_MISSING_ATTR = 1650
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_ENTRY_BROKEN = 1651 # 1651
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_PREFER_VALUE = 1652 # 1652
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_NOT_CATALOG = 1653 # 1653
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_RECURSION = 1654 # 1654
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG=20
lxml-2.1.1/src/lxml/xmlerror.pxi:WAR_CATALOG_PI=93
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_MISSING_ATTR=1650
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_ENTRY_BROKEN=1651
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_PREFER_VALUE=1652
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_NOT_CATALOG=1653
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_RECURSION=1654

Из реализации каталога на странице libxml2 кажется возможным, что обработка 'transparent' через установку в /etc/xml/catalog все еще может работать в lxml, но если вам нужно больше, чем это, вы всегда можете отказаться от lxml и использовать привязки по умолчанию python, которые предоставляют функции каталога.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться