gpt4 book ai didi

python - 使用 lxml 解析 DTD 时出错

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:06 26 4
gpt4 key购买 nike

我正在尝试编写一个验证脚本来根据 NITF DTD 验证 XML,http://www.iptc.org/std/NITF/3.4/specification/dtd/nitf-3-4.dtd .基于this post我提出了以下简单脚本来验证 NITF XML 文档。 Bellow 是我在运行脚本时收到的错误消息,它不是很具有描述性并且很难调试。感谢您的帮助。

#!/usr/bin/env python


def main():
from lxml import etree, objectify
from StringIO import StringIO

f = open('nitf_test.xml')
xml_doc = f.read()
f.close()

f = open('nitf-3-4.dtd')
dtd_doc = f.read()
f.close()

dtd = etree.DTD(StringIO(dtd_doc))
tree = objectify.parse(StringIO(xml_doc))
dtd.validate(tree)


if __name__ == '__main__':

main()

回溯错误信息:

Traceback (most recent call last):
File "./test_nitf_doc.py", line 23, in <module>
main()
File "./test_nitf_doc.py", line 16, in main
dtd = etree.DTD(StringIO(dtd_doc))
File "dtd.pxi", line 43, in lxml.etree.DTD.__init__ (src/lxml/lxml.etree.c:126056)
File "dtd.pxi", line 117, in lxml.etree._parseDtdFromFilelike (src/lxml/lxml.etree.c:126727)
lxml.etree.DTDParseError: error parsing DTD

如果我改变行:

dtd = etree.DTD(StringIO(dtd_doc))

收件人:

dtd = etree.DTD(dtd_doc)

我得到的错误是:

lxml.etree.DTDParseError: failed to load external entity "NULL"

最佳答案

我查看了 nitf-3-4.dtd 并发现它引用了一个外部模块 xhtml-ruby-1.mod ,它可以是 downloaded at this link 。这需要出现在当前目录中,以便 DTD 解析器可以加载它。

完整的工作示例(假设您手边有有效的 NITF 文档):

% wget http://www.iptc.org/std/NITF/3.4/specification/dtd/nitf-3-4.dtd
% wget http://www.iptc.org/std/NITF/3.4/specification/dtd/xhtml-ruby-1.mod

Python代码:

from lxml import etree, objectify
dtd = etree.DTD(open('nitf-3-4.dtd', 'rb'))
tree = objectify.parse(open('nitf_test.xml', 'rb'))
print dtd.validate(tree)

输出:

% python nitf_test.py
True

关于python - 使用 lxml 解析 DTD 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com