Потенциальная ошибка в lxml(etree.XMLSchema): не проверяет отношения IDREF в документе xml

Я использую объект lxml XMLSchema для проверки xml-файла на соответствие моему xsd, в котором указаны ограничения xs: ID и xs: IDREF. Однако lxml, по-видимому, проверяет xml-документ на true, даже если для IDREF нет соответствующего идентификатора.

Любые идеи о том, как решить эту проблему?

Редактировать:

XSD:

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

<xs:complexType name="ModuleType">
    <xs:attribute name="id" type="xs:ID" use="required"/>
    <xs:attribute name="path" type="xs:string" use="required"/>
    <xs:anyAttribute processContents="lax"/>
</xs:complexType>

<xs:complexType name="ModulesType" mixed="true">
    <xs:sequence>
        <xs:element name="Module" type="ModuleType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute processContents="lax"/>
</xs:complexType>

<xs:complexType name="FrameworkType" mixed="true">
    <xs:all>
        <xs:element name="Good">
            <xs:complexType>
                <xs:attribute name="moduleId" type="xs:IDREF" use="required"/>
                <xs:anyAttribute processContents="lax"/>
            </xs:complexType>
        </xs:element>
        <xs:element name="Bad">
            <xs:complexType>
                <xs:attribute name="moduleId" type="xs:IDREF" use="required"/>
                <xs:anyAttribute processContents="lax"/>
            </xs:complexType>
        </xs:element>
    </xs:all>
    <xs:anyAttribute processContents="lax"/>
</xs:complexType>

<xs:complexType name="TestbenchType" mixed="true">
    <xs:sequence>
        <xs:element name="Modules" type="ModulesType"/>
        <xs:element name="Framework" type="FrameworkType"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="Testbench" type="TestbenchType"/>

</xs:schema>

XML:

<Testbench xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.chaos.com">

<Modules>
    <Module id="Module1" path="Testbench_module1.py"/>
    <Module id="Module2" path="Testbench_module2.py"/>
</Modules>

<Framework>
    <Good moduleId="Module1"/>
    <Bad moduleId="ModuleX"/>
</Framework>

</Testbench>

Код проверки Python:

from lxml import etree
from cStringIO import StringIO

try:
    #Get schema
    buf_schema = StringIO()
    with open(schema,'r') as fh:
        for line in fh: buf_schema.write(line)
    buf_schema.seek(0)
    Schema = etree.XMLSchema(etree.parse(buf_schema))
    buf_schema.close()

    # Validate
    buf_cfg = StringIO()
    with open(cfg,'r') as fh:
        for line in fh: buf_cfg.write(line)
    buf_cfg.seek(0)
    Schema.assertValid(etree.parse(buf_cfg))
    buf_cfg.close()
except etree.XMLSyntaxError, err:
    return False, str(err)
except Exception, err:
    return False, str(err)
return True,None

Эта функция возвращает True для данного XSD / XML, даже если атрибут moduleId элемента Bad нарушает ограничение IDREF

0 ответов

Другие вопросы по тегам