如何使用python中的嵌套元素验证xml?

时间:2019-03-05 15:03:45

标签: python xml validation xsd

我正在尝试编写具有递归嵌套元素的xml。我想创建类似的东西:

main.xsd:定义根元素和框架元素。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="sub.xsd"/>

<xsd:element name="root" type="element"/>

<xsd:element name="frame" type="element"/>

<xsd:complexType name="element" mixed="true">
    <xsd:choice >
        <xsd:element name="subelement" type="sub" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="frame" type="element" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:choice>
    <xsd:attribute name="id" use="optional" type="xsd:string"/>
</xsd:complexType>

sub.xsd:定义一个新的子元素sub。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="sub" type="sometype"/>

<xsd:complexType name="sometype" mixed="true">
    <xsd:choice >
        <xsd:element name="somelement" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:>
    <xsd:attribute name="id" use="optional" type="xsd:string"/>
</xsd:complexType>

我想在python中验证以下xml文件。我正在为这个简单的xml使用lxml / elementree:

<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="main.xsd"
<root>
    <frame>
        <sub/>
    </frame>
</root>

这个想法是让框架类型元素可以递归地包含无限的框架和其中的子元素,从而不受限制。 问题是我无法通过验证。 我是否正确定义了xml和xsd? xsd的递归结构正确吗?将会有多个元素,例如sub。这个例子是最简单的例子(我想)。 我正在使用pycharm,因此在编辑器中没有看到任何错误,但使用lxml的验证失败。在这种情况下,如果在不同的xsd中定义了不同的子元素,请提供一些可以使用libxml进行验证的解决方案。

让我知道是否需要更多信息。这是我第一次从头开始创建模式,请原谅我的xml。我检查了定义递归元素的堆栈上的其他示例,但无法使它们正常工作。不知道我在做什么错。非常感谢您的帮助。

谢谢

0 个答案:

没有答案