XML实例禁止未在架构中定义的元素

时间:2018-03-03 16:46:33

标签: xml xsd xsd-validation xml-validation

我正在创建一个XML模式,以便向数据记者提供反馈。 如何使用未在架构中定义的元素阻止另一方基于架构创建文件?

使用以下架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="logical-model" 
           targetNamespace="logical-model"
           elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="logicalModelErrors">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="reportSetAspects"/>
            <xs:element name="errorsPerEntity"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="reportSetAspects">
    <xs:complexType>
        <xs:sequence >
            <xs:element name="aspect" minOccurs="1" maxOccurs="2"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="aspect">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>
</xs:schema>

我的例子是:

<?xml version="1.0" encoding="UTF-8"?>
<logicalModelErrors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="logical-model" xsi:schemaLocation="logical-model LogMod.xsd">
  <reportSetAspects>
    <aspect name="bank identifier">BANK-ABDC1234</aspect>
    <aspect name="reporting reference date">2018-04-01</aspect>
    <abc>dd</abc>
  </reportSetAspects>
  <def>sss</def>
</logicalModelErrors>

如果我在XMLSpy中验证此文件,我会收到def但不是abc的错误消息。 错误讯息:

Element <def> is not allowed under element <logicalModelErrors>.
Reason: No more elements expected.
Error location: logicalModelErrors / def

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

更改

        <xs:element name="reportSetAspects"/>

        <xs:element ref="reportSetAspects"/>

以使用reportSetAspects的全局声明。否则,将使用reportSetAspects的新本地声明,并且其中允许使用任何内容模型,因为它仅指定元素名称。

其他说明:

  • aspect遇到了类似的问题。
  • errorsPerEntity目前允许任何内容出于类似原因。
  • 在您的XSD中,<xml version="1.0" encoding="UTF-8"?>应该是<?xml version="1.0" encoding="UTF-8"?> [请注意缺少?]。