Функция Python xml.dom.minidom.parse () игнорирует DTD - PullRequest
3 голосов
/ 18 ноября 2008

У меня есть следующий код Python:

import xml.dom.minidom
import xml.parsers.expat

try:
    domTree = ml.dom.minidom.parse(myXMLFileName)
except xml.parsers.expat.ExpatError, e:
    return e.args[0]

, который я использую для разбора файла XML. Хотя он довольно удачно обнаруживает простые ошибки XML, такие как несоответствующие теги, он полностью игнорирует DTD, указанный в верхней части XML-файла:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ServerConfig SYSTEM "ServerConfig.dtd">

, поэтому он не замечает, например, когда отсутствуют обязательные элементы. Как включить проверку DTD?

Ответы [ 5 ]

4 голосов
/ 18 ноября 2008

См. этот вопрос - принятый ответ должен использовать lxml validation .

3 голосов
/ 18 ноября 2008

Просто для пояснения: Python xml.dom.minidom и xml.sax по умолчанию используют синтаксический анализатор, который не проверяет синтаксический анализатор. Он может прочитать DTD, чтобы выполнить замену объекта, но он не будет проверяться по DTD.

gimel и Tim рекомендуют lxml, который является приятным питоническим связыванием для библиотек libxml2 и libxslt. Он поддерживает проверку по DTD. Я использую lxml, и мне это очень нравится.

2 голосов
/ 18 ноября 2008

Просто для записи, вот как выглядит мой код:

from lxml import etree

try:
    parser = etree.XMLParser(dtd_validation=True)
    domTree = etree.parse(myXMLFileName, parser=parser)
except etree.XMLSyntaxError, e:
    return e.args[0]
1 голос
/ 18 ноября 2008

Я рекомендую lxml over xmlproc, потому что пакет PyXML (содержащий xmlproc) больше не разрабатывается; последняя версия Python, с которой можно использовать PyXML, это 2.4.

0 голосов
/ 18 ноября 2008

Полагаю, вам нужно перейти с expat на xmlproc.
Увидеть: http://code.activestate.com/recipes/220472/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...