XSD simpleContent

时间:2014-09-29 07:49:05

标签: xml xsd

大家好,我的xsd遇到了一些困难。这是XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<Modules xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="module.xsd">

<Module code="CSE2041">
<Name shortName="Web 2">Web Technologies II</Name>
<Level>2</Level>
<ResourcePerson>
<FullName>John Smith</FullName>
</ResourcePerson>
</Module>

<Module code="CSE1244">
<Name shortName="ABCD">Some Module Name</Name>
<Level>1</Level>
<ResourcePerson>
<Name>Janet</Name>
<Surname>Higgins</Surname>
</ResourcePerson>
</Module>
</Modules>

所以基本上我对<Module code="CSE2041">部分有疑问。这是我的XSD代码:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" 

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

<xs:complexType name="moduleType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

<xs:complexType name="nameType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="shortname" type="xs:string"/>
<xs:extension>
</xs:simpleContent>
</xs:complexType>


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

<xs:element name="Module" type="moduleType"/>

<xs:element name="Name" type="nameType"/>

<xs:element name="Level" type="xs:integer"/>

<xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>

<xs:element name="FullName" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Surname" type="xs:string"/>

</xs:choice>
</xs:complexType>
</xs:element>

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

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

</xs:schema>

我在关闭<xs:element name="Module" type="moduleType"/>标记时遇到问题。这一定是错的,因为我得到了这部分的错误。有人能告诉我如何正确关闭它吗?我的XSD文档有什么问题吗?感谢。

1 个答案:

答案 0 :(得分:1)

如果您正确缩进代码,它会对您有所帮助。

XSD

下面

<xs:extension base="xs:string">
    <xs:attribute name="shortname" type="xs:string"/>
<xs:extension>

您没有正确关闭extension。应该是

<xs:extension base="xs:string">
    <xs:attribute name="shortname" type="xs:string"/>
</xs:extension>  <!-- Closed -->

在底部,你有一堆无用的结束标签(谁知道你可能没有向我们展示一切

在上一次结束schema

之后摆脱这三个

完整有效架构

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"

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

    <xs:complexType name="moduleType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="code" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="nameType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="shortname" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:element name="Modules">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Module" type="moduleType" />
                <xs:element name="Name" type="nameType" />
                <xs:element name="Level" type="xs:integer" />
                <xs:element name="ResourcePerson" minOccurs="1"
                    maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:choice>
                            <xs:element name="FullName" type="xs:string" />
                            <xs:element name="Name" type="xs:string" />
                            <xs:element name="Surname" type="xs:string" />
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

XML

尝试按原样验证xml文件,您将看到第一个错误

  

元素'模块'必须没有元素[children]。

<Module>元素中包含子元素。 ModuleType只不过是一个属性为code

的空元素

在我们确定尝试再次验证之后,我们得到了

  

属性'shortName'不允许出现在元素'Name'

<xs:attribute name="shortname" type="xs:string" />区分大小写。 shortName != shortname

修正,然后我们得到

  

从元素Module开始发现无效内容。预计会有一个“{ResourcePerson}”。

为什么我们这样做?好吧,您的Modules元素只允许某个序列。

  1. <xs:element name="Module">
  2. <xs:element name="Name">
  3. <xs:element name="Level">
  4. <xs:element name="ResourcePerson" maxOccurs="unbounded">
  5. 所以你可以只拥有前三个,然后是ResourcePerson个元素。所以这就是有效的实例文档的样子

    <?xml version="1.0" encoding="UTF-8"?>
    <Modules>
        <Module code="CSE2041" />
        <Name shortname="Web 2">Web Technologies II</Name>
        <Level>2</Level>
        <ResourcePerson>
            <FullName>John Smith</FullName>
        </ResourcePerson>
        <ResourcePerson>
            <Surname>Higgins</Surname>
        </ResourcePerson>
    </Modules>
    

    请注意ResourcePerson如何只有一个子元素。这是choice的结果。

    现在我不认为这是你期望从你的架构中获得的结果,所以你可能不得不再次尝试它。

    但也许你想要更像这样的东西

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema elementFormDefault="qualified"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <xs:complexType name="moduleType">
            <xs:sequence>
                <xs:element name="Name" type="nameType" />
                <xs:element name="Level" type="xs:integer" />
                <xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:choice>
                            <xs:element name="FullName" type="xs:string" />
                            <xs:element name="Name" type="xs:string" />
                            <xs:element name="Surname" type="xs:string" />
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="code" type="xs:string" />
        </xs:complexType>
    
        <xs:complexType name="nameType">
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="shortname" type="xs:string" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    
        <xs:element name="Modules">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="Module" type="moduleType" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    您有Module个元素,其中包含name,level和resource person元素。然后在文档级Modules中,您有Module

    的无限次出现次数

    所以这会验证

    <?xml version="1.0" encoding="UTF-8"?>
    <Modules>
        <Module code="CSE2041">
        <Name shortname="Web 2">Web Technologies II</Name>
        <Level>2</Level>
        <ResourcePerson>
            <FullName>John Smith</FullName>
        </ResourcePerson>
        </Module>
        <Module code="CSE2041">
        <Name shortname="Web 2">Web Technologies II</Name>
        <Level>2</Level>
        <ResourcePerson>
            <FullName>John Smith</FullName>
        </ResourcePerson>
        </Module>
    </Modules>
    

    至于命名问题。您可能只需group喜欢

    <xs:group name="NameGroup">
        <xs:sequence>
            <xs:element name="Name" type="xs:string"/>
            <xs:element name="SurName" type="xs:string"/>
        </xs:sequence>
    </xs:group>
    

    然后做

    <xs:element name="ResourcePerson" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
            <xs:choice>
                <xs:element name="FullName" type="xs:string" />
                <xs:group ref="NameGroup"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    

    这样,它可以是FullName group NameSurName。然后你可以使用ResourcePerson

    <ResourcePerson>
        <FullName>John Smith</FullName>
    </ResourcePerson>
     -- or --
    <ResourcePerson>
        <Name>John</Name>
        <SurName>Smith</SurName>
    </ResourcePerson>