首页 > 解决方案 > 具有 simpleType 或 complexType 子元素的 XSD 内容模型?

问题描述

我试图让一个 XML 元素能够使用 acomplexType和 asimpleType作为其类型属性。我对 XML 和 XSD 比较陌生,我不确定这是否可行。我写了一些测试代码来解释这个问题。

我必须工作的一种半解决方案只是创建两种不同的EntityType类型,但在这种情况下,我不想这样做,因为将所有相同的元素重写为新类型只是为了更改PhoneNumber元素类型两种EntityType类型感觉像是在浪费代码,尤其是当EntityType其中可以包含更多元素时。我已经尝试查看 XML 版本 1.1 并使用xs:alternative,但我不确定它是否适用于这种特殊情况。

这是我的 XML:

<?xml version="1.0" encoding="UTF-8"?>

<City>
    <Bob>
        <Name>Bob</Name>
        <PhoneNumber>262-662-6262</PhoneNumber>
    </Bob>

    <QMart>
        <Name>QMart</Name>
        <PhoneNumber>
            <FAX>#45654</FAX>
            <PhoneNumber>262-333-3939</PhoneNumber>
            <PhoneNumber2>262-412-8633</PhoneNumber2>
        </PhoneNumber>
    </QMart>
</City>

这是 XSD:

?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="City" type="CityType"/>

    <xs:complexType name="CityType">
        <xs:sequence>
            <xs:element name="Bob" type="EntityType"/>
            <xs:element name="QMart" type="EntityType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="EntityType">
        <xs:sequence>
            <xs:element name="Name" type="NameType"/>

            <!-- I want both Bob and QMart to use the same EntityType type,
                but the only difference is that QMart uses the complex
                PhoneNumberType for element PhoneNumber, while Bob uses
                the simple PhoneNumberValueType for the PhoneNumber element

                Bob: <xs:element name="PhoneNumber" type="PhoneNumberValueType"/> 
                QMart: <xs:element name="PhoneNumber" type="PhoneNumberType"/>
            -->

        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="PhoneNumberType">
        <xs:sequence>
            <xs:element name="FAX" type="FAXType"/>
            <xs:element name="PhoneNumber" type="PhoneNumberValueType"/>
            <xs:element name="PhoneNumber2" type="PhoneNumberValueType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="PhoneNumberValueType">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>

    <xs:simpleType name="NameType">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>

    <xs:simpleType name="FAXType">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
</xs:schema>

我已经尝试使用xs:union元素验证 XML 和 XSD,但这仅适用于simpleTypes。我不确定我还能做什么,而且我的想法已经不多了。任何帮助表示赞赏!

标签: xmlxsdxsd-validationxml-validation

解决方案


关于您的标题问题,请参阅XSD 允许同一元素的 simpleType 和 complexType 内容? 有一些子问题,我将在下面依次解决......


我试图让一个 XML 元素能够使用 acomplexType和 a simpleType作为其类型属性。

这是令人困惑的陈述,可能是因为您在某种通用意义上使用了“属性”;在 XML 的上下文中这样做,其中“属性”意味着非常具体的东西,必然会造成混乱。


关于

两种EntityType类型感觉像是在浪费代码,尤其是当EntityType其中可以包含更多元素时。

减少此类重复的常用方法是通过xsd:group. 看


关于拥有两种电话号码,请考虑拥有两个不同命名的元素,一个用于每种(简单和复杂)类型,并xsd:choice在包含内容模型中使用以允许您希望允许电话号码的任一元素。


推荐阅读