作者XSD允许可扩展元素

时间:2013-01-23 23:04:33

标签: xml xsd schema

我想创建一个XSD来验证XML文件。 XML文件的示例可能如下所示:

<person>
    <fullname>John Doe</fullname>
    <age>25</age>
    <gender>male</gender>
</person>

其中一个要求是<person>标记是可扩展的,这意味着除了上面3个必需的子元素之外,它还可以包含任意名称的任意元素。因此,当XSD验证时,此文档将有效。

 <person>
    <fullname>John Doe</fullname>
    <age>25</age>
    <gender>male</gender>
    <address>USA</address>
    <profession>worker</profession>
</person>

我读到了<xs:any />元素,但XSD不允许我将<xs:any />放在<xs:all />元素中。我希望<fullname><gender><age>元素是必需的,并且每个元素必须只显示一个。除此之外,可以有零个或多个可选元素。

是否可以使用受支持的XSD规则实现此目的?

1 个答案:

答案 0 :(得分:0)

组合xs:all和xs:any可以创建含糊不清的内容,这就是为什么不允许这样做的原因。但是,如果内容包含在xs:sequence中,则可以执行此操作。

注意:确保xs:any上的namespace和processContent属性已根据您的要求正确设置。

他们使用xs:openContent标签更好地支持XSD 1.1中的这种可扩展性,但支持XSD 1.1。仍然有限。

enter image description here

 <?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2016 Developer Bundle Edition 14.1.3.6618 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="fullname" type="xs:string" />
                <xs:element name="age" type="xs:int" />
                <xs:element name="gender">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="male" />
                            <xs:enumeration value="female" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:any namespace="##any" processContents="skip" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>