XML使用外部DTD进行验证--XML解析器是Python (lxml),该解析器不能从HTTPS端加载外部DTD。

问题描述 投票:0回答:1

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

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

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

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

现在是我的问题。是否有可能在Python-lxml中使用一个外部DTD,而这个DTD只能通过HTTPS服务器访问?不幸的是,我无法在服务器上创建一个使用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)

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

python xml lxml dtd
1个回答
0
投票

这个 网页 描述了一些解决这个问题的方法。

你可以

  • 设置一个XML目录(你可以用它在本地的某个地方存储DTD)。
  • 创建你自己的resolver类,它可以重定向URL,或者从其他地方检索DTD。
© www.soinside.com 2019 - 2024. All rights reserved.