使用DTD验证XML时,无法使用lxm导入实体

2024-09-26 18:05:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成NewsML类型XML文件的工具,我想在生成这些文件后验证它们。 我收到一个错误:

Attempt to load network entity http://www.w3.org/TR/ruby/xhtml-ruby-1.mod

python调用是:

parser = etree.XMLParser(load_dtd=True, dtd_validation=True)
treeObject = etree.parse(f, parser)

首先,我不确定是否需要两个“loaddtd=True,dtd_validation=True”,但我还是在使用它。 第二个错误似乎来自导入的nitf-3-4.dtd,它的定义是:

^{pr2}$

lxml会出去检索xhtml-ruby-1.mod还是必须在本地保存所有DTD文件。在


Tags: 文件工具modtrueparser类型错误load
1条回答
网友
1楼 · 发布于 2024-09-26 18:05:14

尝试用no_network=False构造解析器。如documentation所述:

no_network - prevent network access when looking up external documents (on by default)

导入的dtd模块应该由lxml检索,但是如果不允许网络访问,它就不能这样做(这不包括文档本身,只用于加载外部引用文档)。事实上,我希望您在加载dtd本身时出错,所以我假设文档引用了该dtd的本地可用副本,并且只有dtd本身引用了远程资源?)在

您还可以使用目录来使用本地可用的副本(不仅可以避免这个问题,而且性能更高,对w3c服务器更友好;-)。Libxml2(由lxml使用)将检查/etc/xml/catalog中是否存在目录,以及XML_CATALOG_FILES环境变量(请参见Libxml2 docs

(也可以为lxml编写自己的resolvers来拦截和处理请求,但在这种情况下,这样做可能有点过头了)

注意,除了解析时间验证之外还有另一个选项:使用DTD class分别加载dtd,并将其用作验证器。在

这将使用所提供的dtd验证已解析的文档,而不管doctype声明引用了哪个dtd(如果有的话)(这很方便:根据您想要的dtd,并不是每个有效的xml文件都必须有效)。在

因为dtd只需要检索和解析一次,如果您要验证大量文档,这应该会更快,而且(如果我没弄错的话),您不会遇到无网络问题。在

这种方法的另一个好处是:您甚至可以在序列化元素/元素树之前验证它们(如果您的生产工具使用的是lxml)。在

最后一点:只有在解析时可以访问dtd(无法解析的实体…)时,才能解析某些文档。如果可以的话,避免这种情况。(而且,尽管不是每个人都同意:如果可能的话,完全避免doctype声明)。在

相关问题 更多 >

    热门问题