在XML文档上应用XML模式

时间:2014-03-12 21:16:19

标签: xml xml-parsing

如果XML文档中有两个具有相同名称的标记,是否必须为每个标记使用两个不同的模式,或者可以使用1个模式,它是否会验证?下面是一个使用2个模式的示例,但我只使用了一个模式,哪一个是正确的?

使用2个架构的XML文档

    <?xml version="1.0" encoding="ISO-8859-1"?> 
<receipt xmlns: cu="http://www.mydomain.com/customer" 
 xmlns: pr="http://www.mydomain.com/product">  <!--two schema's being referenced-->

<cu:customer> <!--Using Schema 1-->
<cu:name> Michael Johnson </cu:name> 
<cu:areaCode> BH2 3XY </cu:areaCode> 
</cu:customer> 

<products> 
<pr:product>  <!--Using Schema 2-->
<pr:name>RAM</pr:name> 
<pr:quantity>100</pr:quantity> 
</pr:product> 
</products> 
</receipt>

我的XML文档使用1个架构(有2个同名的标签,称为项目)

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

<shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> 
    <orderperson>John Smith</orderperson> 
        <shipto> 
            <name>Ola Nordmann</name> 
            <address>Langgt 23</address> 
            <city>4000 Stavanger</city> 
            <country>Norway</country> 
        </shipto> 
        <item> 
            <title>Empire Burlesque</title> 
            <note>Special Edition</note>  
            <quantity>1</quantity> 
            <price>10.90</price> 
        </item> 
        <item> 
            <title>Hide your heart</title> 
            <quantity>1</quantity> 
            <price>9.90</price> 
        </item> 
</shiporder> 

XML Schema:

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
    <xs:complexType >
        <xs:sequence>
            <xs:element type="xs:string" name="orderperson"/>
            <xs:element name="shipto">
                <xs:complexType>
                  <xs:sequence>
              <xs:element type="xs:string" name="name"/>
              <xs:element type="xs:string" name="address"/>
              <xs:element type="xs:string" name="city"/>
              <xs:element type="xs:string" name="country"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element> 
            <xs:element name="item"  maxOccurs="unbounded" minOccurs="0"> 
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="title" type="xs:string"/>
                        <xs:element name="note" type="xs:string" minOccurs="0"/> <!--optional-->
                        <xs:element name="quantity" type="xs:integer"/>
                        <xs:element name="price" type="xs:decimal"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    <xs:attribute name="orderid" type="xs:int" /> <!--must be required-->
    </xs:complexType>
</xs:element>

2 个答案:

答案 0 :(得分:0)

您可以在第三个模式中定义项目,然后将其包含在其他模式中。

Can I have one XML Schema (XSD) include another XML-Schema?。并http://www.w3schools.com/schema/el_include.asp

答案 1 :(得分:0)

第一个xml使用两个不同的模式,因此使用两个不同的名称空间。 是的,您可以从不同的模式派生xml

第二个xml有两个元素并没有错。可重复元素是如何表示对象列表或类似的东西,在这种情况下是项目列表。

<item> is defined to be occurring more than once as per the schema.
maxOccurs="unbounded" so it is valid xml as per the schema.

Is that not true?

<xs:element name="item"  maxOccurs="unbounded" minOccurs="0"> 
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="title" type="xs:string"/>
                        <xs:element name="note" type="xs:string" minOccurs="0"/> <!--optional-->
                        <xs:element name="quantity" type="xs:integer"/>
                        <xs:element name="price" type="xs:decimal"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>