【问题标题】:XSD content model with a simpleType or a complexType child element?具有 simpleType 或 complexType 子元素的 XSD 内容模型?
【发布时间】:2019-07-25 18:32:14
【问题描述】:

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

我必须工作的一种半解决方案只是创建两个不同的EntityType 类型,但在这种情况下,我不想这样做,因为将所有相同的元素重写为新类型只是为了更改两个EntityType 类型中的PhoneNumber 元素类型感觉就像在浪费代码,尤其是当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。我不确定我还能做什么,而且我的想法已经不多了。任何帮助表示赞赏!

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    关于您的标题问题,请参阅XSD allowing both simpleType and complexType content for same element? 我将在下面依次解决一些子问题...


    我正在尝试让 XML 元素能够使用 complexTypesimpleType 为其类型属性。

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


    关于

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

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


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

    【讨论】:

    • 感谢您的指导!我一定会尝试所有这些。我什至不知道有一个 标签,所以我要阅读它。
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多