Как проверить XML с помощью XSD в Python - PullRequest
1 голос
/ 19 сентября 2019

У меня проблемы с проверкой XML, который я должен сгенерировать.Я пытаюсь следовать руководству lxml, но оно использует строки, и пример выглядит следующим образом:

>>> f = StringIO('''\
... <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
... <xsd:element name="a" type="AType"/>
... <xsd:complexType name="AType">
...   <xsd:sequence>
...     <xsd:element name="b" type="xsd:string" />
...   </xsd:sequence>
... </xsd:complexType>
... </xsd:schema>
... ''')
>>> xmlschema_doc = etree.parse(f)
>>> xmlschema = etree.XMLSchema(xmlschema_doc)
>>> valid = StringIO('<a><b></b></a>')
>>> doc = etree.parse(valid)
>>> xmlschema.validate(doc)
True

В моем случае у меня есть XSD-файл, поэтому я пытаюсь это:

from lxml import etree as ET
root = ET.Element('root_name', nsmap={'xsi': 'http://www.w3.org/2001/XMLSchema-instance'})
sub_element = (root, 'sub_element_name')
generated_xml = ET.parse(StringIO(ET.tostring(root)))
xsd_doc = ET.parse(xsd_file)
xmlschema = ET.XMLSchema(xsd_doc)
xmlschema.validate(generated_xml)

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

1 Ответ

1 голос
/ 19 сентября 2019

Мне удалось сделать то, что я искал, с помощью следующего кода:

from lxml import etree
from io import StringIO

root = etree.Element('a')
child1 = etree.SubElement(root, 'b')
print(etree.tostring(root))
xmlschema_doc = etree.parse('test_xsd.xsd')
xmlschema = etree.XMLSchema(xmlschema_doc)
doc = etree.XML(etree.tostring(root))
validation_result = xmlschema.validate(doc)
print(validation_result)

, где содержимое test_xsd.xsd равно:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="a" type="AType"/>
<xsd:complexType name="AType">
  <xsd:sequence>
    <xsd:element name="b" type="xsd:string" />
  </xsd:sequence>
</xsd:complexType>
</xsd:schema>

и результатсбывается.Если у кого-то есть лучшее решение, это очень приветствуется

...