繁体   English   中英

XML uses an external DTD for validation - XML parser is Python (lxml) and this parser cannot load the external DTD from the HTTPS side

[英]XML uses an external DTD for validation - XML parser is Python (lxml) and this parser cannot load the external DTD from the HTTPS side

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

我有一个 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)

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

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

您可以:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM