首页 > 解决方案 > XML 使用外部 DTD 进行验证 - XML 解析器是 Python (lxml),此解析器无法从 HTTPS 端加载外部 DTD

问题描述

我还有另一个我很绝望的问题。我认为这个问题有很多解决方案,但我想知道我的方法是否可以以某种方式实施。

我有一个 XML 文件使用一个外部 DTD,并使用 XML DOCTYP 定义。

xml 文件使用 Python (lxml) 进行解析。因此,可以使用 XML DOCTYP 中定义的 DTD 自动验证不同的文件。我使用可以通过互联网地址访问的外部 DTD。但是这个互联网站点将每个请求重定向到 HTTPS 端口。由于这个原因,Python 无法访问外部 DTD。

多亏了我的一个朋友,我才能够使用一个仍然在 HTTP 上运行的旧的、未使用的网站。解析器可以找到并使用此存储网站上的 DTD。

现在我的问题。是否可以将只能通过 HTTPS 服务器访问的外部 DTD 与 Python-lxml 一起使用?不幸的是,我无法在使用 HTTP 端口的服务器上创建一个区域。

我已经尝试通过 HTTP 请求获取外部 DTD,但它被重定向到 HTTPS 端口。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE book PUBLIC "-//AA//Test//EN" "***">
<!-- <!DOCTYPE book PUBLIC "-//AA//Test//EN" "***"> -->
<book>
    <book-meta>
        <book-id pub-id-type="other">handbook</book-id>
        <book-title-group Id="1">
            <book-title name="Hallo">The NCBI Handbook</book-title>
        </book-title-group>
    </book-meta>
</book>

为了完整起见,这里是一个示例 DTD。

<!ELEMENT book ANY>
<!ATTLIST book
      Release                       CDATA "v0.0.1"
>

<!ELEMENT book-meta ANY> <!-- # related objects: 0 -->
<!ATTLIST book-meta
       Value                        CDATA "Das ist eine Information"
>
<!ELEMENT book-id ANY> <!-- # related objects: 0 -->
<!ATTLIST book-id
       pub-id-type                      CDATA #REQUIRED
>
<!ELEMENT book-title-group ANY> <!-- # related objects: 0 -->
<!ATTLIST book-title-group
         Id                                         CDATA #IMPLIED 
>
<!ELEMENT book-title ANY> <!-- # related objects: 0 -->
<!ATTLIST book-title
      name CDATA #REQUIRED
>

为了解析 XML 文件,我使用了带有库 lxml 的 python 脚本。以下是测试程序。

import xml.etree.ElementTree as ET 
import lxml
from lxml import etree  

myParser = lxml.etree.XMLParser(attribute_defaults  = True, dtd_validation = True, load_dtd =True, no_network = False)
xmlFile  = lxml.etree.parse("XML_DTDValidation.xml", parser=myParser)
xmlFile.xinclude()
xmlFile.write("XML_DTDValidation_out.xml",method="xml",xml_declaration=True, encoding='utf-8',pretty_print=True)

我希望我能很好地总结我的问题,有人可以帮助我。

标签: pythonxmllxmldtd

解决方案


页面描述了一些解决此问题的方法。

您可以:

  • 设置一个 XML 目录(您可以使用它来将 DTD 存储在本地某处)
  • 创建自己的解析器类,它要么重定向 URL,要么从其他地方检索 DTD。

推荐阅读