XSD / XML - 在[...]内的元素内定义元素

时间:2015-07-13 10:24:09

标签: xml validation xsd

我无法验证以下内容(XSD是的,我知道)结构:

    <Mappings>
          <Mapping name="foo" type="bar">a string</Mapping>
          <Mapping name="Model" type="TableMapping" valueformat=">
             <Entry expression="some expression" value="some value"/>
             <Entry expression="some other expression" value="some other value"/>
          </Mapping>
    </Mappings>

为此我有这个架构:

<xs:complexType name="Mappings">
    <xs:sequence>
        <xs:element name="Mapping" maxOccurs="unbounded" minOccurs="1">
            <xs:complexType>
                <xs:simpleContent>
                    <xs:extension base="xs:string">
                        <xs:attribute type="xs:string" name="name"/>
                        <xs:attribute type="AllowedMappingTypes" name="type"/>
                        <xs:attribute type="xs:string" name="valueformat"/>
                    </xs:extension>
                </xs:simpleContent>

                <xs:element name="Entry" maxOccurs="unbounded" minOccurs="1">
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:sequence>
                                <xs:attribute type="xs:string" name="expression"/>
                                <xs:attribute type="xs:string" name="value"/>
                            </xs:sequence>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:element>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

即。 Mapping元素可以在其中包含Entry元素,但这不是必需的。验证因格式错误而失败:

XMLSchemaParseError: Element'{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))., line 121

这一行:

 <xs:element name="Entry" maxOccurs="unbounded" minOccurs="1">

所以我的问题是;如何正确编写XSD以便能够使用属性列表和具有某些特定属性的可选条目进行映射?我相信这可能很简单,但我缺乏..尝试重新组织标签并尝试不同的标签,但它不起作用。 此致

1 个答案:

答案 0 :(得分:1)

以下代码似乎可以很好地解决我的问题。应该始终记住通过XSD生成器运行代码!显然,您需要在标记中使用<complexType mixed="true">来允许元素内的元素和属性。

<xs:complexType name="Mappings">
    <xs:sequence>
        <xs:element name="Mapping" maxOccurs="unbounded" minOccurs="0">
            <xs:complexType mixed="true">
                <xs:sequence>
                    <xs:element name="Entry" maxOccurs="unbounded" minOccurs="0">
                        <xs:complexType>
                            <xs:simpleContent>
                                <xs:extension base="xs:string">
                                    <xs:attribute type="xs:string" name="expression" use="optional"/>
                                    <xs:attribute type="xs:string" name="value" use="optional"/>
                                </xs:extension>
                            </xs:simpleContent>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute type="xs:string" name="name" use="optional"/>
                <xs:attribute type="AllowedMappingTypes" name="type" use="optional"/>
                <xs:attribute type="xs:string" name="valueformat" use="optional"/>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>