关于XML模式,无法找到XML文档的正确行为

时间:2015-06-11 17:46:01

标签: xml xsd

我是XML架构的新手,我试着了解它们是如何工作的。我写了一个简单的schema.Below是我的xml架构。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="employees" type="comType"/>
    <xs:complexType name="comType">
        <xs:sequence>
            <xs:element ref="employee" maxOccurs="2"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="employee">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:integer" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

但是我对这个架构有效的XML有点困惑。当我使用notpad ++验证以下两个XML时,以下两个XML都没有给出错误,因为我期望带有员工根元素的XML应该正确的。

<?xml version="1.0" encoding="UTF-8"?>
<employees>
    <employee id="1">
        <name>xxxx</name>
        <address>xxx</address>
    </employee>
    <employee id="2">
        <name>yyyyy</name>
    <address>yyy</address>
    </employee>
</employees>    

和第二个XML是

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

<employee id="1">
    <name>Deepak</name>
    <address>909</address>
</employee>

架构是

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
<xs:element name="employees" type="comType"/>   
<xs:complexType name="comType">
<xs:sequence>
<xs:element ref="employee" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>

<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>

需要帮助......

1 个答案:

答案 0 :(得分:0)

两个Xml实例都是正确的,如在Xml Schema中,任何全局定义的<element>都可以作为根元素。这也在answers to this other question中进行了讨论。

由于您已在模式的根级别上使用employees元素定义了employee<xsd:element>(即直接嵌套在<xsd:schema>元素中),这些可以用作架构的Xml实例文档的根目录。

要防止employee符合作为根元素的条件,您可以完全内联employee元素的定义,而不是使用<xs:element ref="employee" maxOccurs="2"/>,或者您可以命名 employee元素的内容并在架构根级别定义complexType,因此您将获得一个可重复使用的复杂类型,然后您可以将其指示为{{1}的类型} element。