缩短XSD

时间:2015-06-05 06:09:45

标签: xml xsd

我有一个XML和相应的XSD如下:

myXSD.xsd:

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com/myXSD"
    xmlns="http://www.example.com/myXSD"
    elementFormDefault="qualified">

    <xs:element name="RootElem">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="Insider1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="Internal" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

                <xs:element name="Insider2">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="Internal" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

                <xs:element name="Insider3">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="Internal" maxOccurs="unbounded" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

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

    <xs:element name="Internal-low">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myString" type="xs:string" maxOccurs="unbounded"></xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Internal">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Step" type="xs:string"></xs:element>
                <xs:element ref="Internal-low" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

myXML.xml:

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

<RootElem xmlns="http://www.example.com/myXSD"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.com/myXSD myXSD.xsd">
    <Insider1>
        <Internal>
            <Step>My step 1</Step>
            <Internal-low>
                <myString>My string 1 for step 1</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 2</Step>
            <Internal-low>
                <myString>My string 1 for step 2</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 3</Step>
            <Internal-low>
                <myString>My string 1 for step 3</myString>
                <myString>My string 2 for step 3</myString>
            </Internal-low>
        </Internal>
    </Insider1>
    <Insider2>
        <Internal>
            <Step>My step 1</Step>
            <Internal-low>
                <myString>My string 1 for step 1</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 2</Step>
            <Internal-low>
                <myString>My string 1 for step 2</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 3</Step>
            <Internal-low>
                <myString>My string 1 for step 3</myString>
                <myString>My string 2 for step 3</myString>
            </Internal-low>
        </Internal>
    </Insider2>
    <Insider3>
        <Internal>
            <Step>My step 1</Step>
            <Internal-low>
                <myString>My string 1 for step 1</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 2</Step>
            <Internal-low>
                <myString>My string 1 for step 2</myString>
            </Internal-low>
        </Internal>
        <Internal>
            <Step>My step 3</Step>
            <Internal-low>
                <myString>My string 1 for step 3</myString>
                <myString>My string 2 for step 3</myString>
            </Internal-low>
        </Internal>
    </Insider3>

</RootElem>

这里一切正常。问题在于InsiderX元素。我的实际XSD中大约有10个InsiderX个元素可能会随着时间的推移而增加。所以我需要压缩XSD代码,以便添加或删除任何InsiderX元素更简单,因为这样做现在需要添加/删除7行冗余代码。我怎样才能确保每个InsiderX元素中只有一个出现在我的XML中。

此外,我想知道XSD中有哪些其他选项可以替换<xs:sequence>。我不想替代这个,但想知道其他可能的选项,如<xs:choice>

2 个答案:

答案 0 :(得分:1)

  

我需要压缩XSD代码,以便添加或删除任何代码   InsiderX元素更简单,因为这样做现在需要添加/删除7   冗余代码行

您可以通过创建这样的可重用类型来缩短XSD。

<xs:complexType name="InsiderXType">
    <xs:sequence>
        <xs:element ref="Internal" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

<xs:element name="RootElem">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Insider1" type="InsiderXType"/>
            <xs:element name="Insider2" type="InsiderXType"/>
            <xs:element name="Insider3" type="InsiderXType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
  

如何确保每个InsiderX中只有一个   元素出现在我的XML

您已经使用原始架构介绍了此方案。通过复制 Insider1 节点来修改XML文档,例如像

<Insider1>
    ...
</Insider1>
<Insider1>
    ...
</Insider1>
<Insider2>
   ...

并尝试针对您的架构验证这一点。您将收到如下错误: cvc-complex-type.2.4.a:从元素'Insider1'开始发现无效内容。其中一个是{{http://www.example.com/myXSD“:Insider2}'。

  

我想知道要替换的XSD中还有哪些其他选项   &LT; XS:序列&GT;

嗯,我不知道如何回答这个问题,因为这个问题确实过于宽泛,但请查看复杂类型定义的XML Schema specification。它表示您可以使用 group all choice 而不是序列。我希望这会让你走上正轨。

答案 1 :(得分:0)

我认为它是可撤销的,处理这种情况的更好方法是在你的xml中有:

<Insider name="Insider1">

而不是

<Insider1>

编辑:(限制名称属性值)

<attribute name="name">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="Insider[0-9]*"/>
        </xs:restriction>
    </xs:simpleType>
</attribute>