XML использует внешний DTD для проверки - XML синтаксический анализатор равен Python (l xml), и этот анализатор не может загрузить внешнее DTD со стороны HTTPS - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть еще одна проблема, которой я отчаянно нуждаюсь. Я думаю, что есть много решений этой проблемы, но я хотел бы знать, может ли мой подход быть реализован каким-либо образом.

У меня есть файл XML, использующий одно внешнее DTD и определяемый с помощью XML DOCTYP .

Файл xml анализируется с Python (l xml). Таким образом, можно автоматически проверять различные файлы с помощью DTD, определенных в XML DOCTYP. Я использую внешний DTD, к которому можно получить доступ по адресу inte rnet. Но этот inte rnet сайт перенаправляет каждый запрос на порт HTTPS. По этой причине Python не может получить доступ к внешнему DTD.

Благодаря моему другу я смог использовать старый, неиспользованный веб-сайт, который все еще работает по HTTP. DTD на этом сохраненном веб-сайте может быть найден и использован синтаксическим анализатором.

Теперь на мой вопрос. Можно ли использовать внешний DTD с Python -l xml, который доступен только через HTTPS-сервер? К сожалению, у меня нет возможности создать область на сервере, которая использует порт HTTP.

Я уже пытался получить внешний DTD через HTTP-запрос, но он перенаправляется на порт 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 с библиотекой l xml. Ниже приведена тестовая программа.

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)

Я надеюсь, что смогу хорошо изложить мою проблему, и кто-то может мне помочь.

1 Ответ

0 голосов
/ 24 апреля 2020

Эта страница описывает некоторые способы обойти это.

Вы можете:

  • настроить каталог XML (который вы можете использовать для хранения DTD где-нибудь локально)
  • создайте свой собственный класс преобразователя, который либо перенаправляет URL-адрес, либо получает DTD из другого места.
...