Проверка файла XML с XSD и l xml в Python вызывает AssertionError - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь проверить пару XML файлов на соответствие их XSD (определение схемы xml). Если файл xml недействителен, я хотел бы указать причину. Я использую:

Я получил следующие примеры от w3schools.com , чтобы проверить мой код. Но выполнение моего кода приводит к следующей ошибке:

AssertionError: Element 'note': No matching global declaration available for the validation root., line 2

Ошибка исчезнет, ​​как только я заменю эту часть XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">

на

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

Может кто-нибудь объяснить, почему я получаю сообщение об ошибке?

Мой код

import os
import sys
from lxml import etree

class Validator:

    def __init__(self, xsd_path):
        parsed_xsd = etree.parse(xsd_path)  # Parse content of xsd file to ElementTree object
        self.xsdschema = etree.XMLSchema(parsed_xsd)

    def validate_xml(self, xml_path):
        parsed_xml = etree.parse(xml_path)
        # result = self.xsdschema.validate(parsed_xml)
        # return result
        self.xsdschema.assert_(parsed_xml)

# Get current path of script
SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))
xsd_path = os.path.abspath(os.path.join(SCRIPT_PATH, 'note.xsd'))
xml_path = os.path.abspath(os.path.join(SCRIPT_PATH, 'note_example.xml'))

validator = Validator(xsd_path)
validator.validate_xml(xml_path)

note.xsd

<?xml version="1.0"?>

<!-- Here is the problematic part -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">
<!-- End of problematic part -->

<xs:element name="note">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="heading" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

note_example. xml

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...