XML 使用外部 DTD 进行验证 - XML 解析器是 Python (lxml) 并且此解析器无法从 HTTPS 端加载外部 DTD
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 服务器访问的带有 Python-lxml 的外部 DTD?不幸的是,我无法在使用 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 文件,我将 python 脚本与库 lxml 一起使用。
下面是测试程序。
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)
我希望我能很好地总结我的问题,有人可以帮助我。
本文 page 描述了一些解决此问题的方法。
您可以:
- 设置一个 XML 目录(您可以使用它来将 DTD 存储在本地某处)
- 创建您自己的解析器 class,它可以重定向 URL,或者从其他地方检索 DTD。
我还有一个问题让我很苦恼。 我认为这个问题有很多解决方案,但我想知道我的方法是否可以某种方式实现。
我有一个 XML 文件使用一个外部 DTD 并用 XML DOCTYP 定义。
xml-文件用 Python (lxml) 解析。因此可以使用 XML DOCTYP 中定义的 DTD 自动验证不同的文件。我使用可以通过互联网地址访问的外部 DTD。但是这个网站将每个请求重定向到 HTTPS 端口。因此 Python 无法访问外部 DTD。
感谢我的一个朋友,我能够使用一个仍然在 HTTP 上运行的旧的、未使用的网站。解析器可以找到并使用此存储网站上的 DTD。
现在是我的问题。是否可以使用只能通过 HTTPS 服务器访问的带有 Python-lxml 的外部 DTD?不幸的是,我无法在使用 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 文件,我将 python 脚本与库 lxml 一起使用。 下面是测试程序。
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)
我希望我能很好地总结我的问题,有人可以帮助我。
本文 page 描述了一些解决此问题的方法。
您可以:
- 设置一个 XML 目录(您可以使用它来将 DTD 存储在本地某处)
- 创建您自己的解析器 class,它可以重定向 URL,或者从其他地方检索 DTD。