zoukankan      html  css  js  c++  java
  • Xml Schema命名空间

    最近总接触Xml.所以写了一个Schema来验证客户端的Xml文件.
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified"  targetNamespace="urn:xx-schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"   xmlns="urn:xx-schema">
        
    <xs:element name="Client_Info">
            
    <xs:complexType>
                
    <xs:sequence>
                    
    <!--只能有一个-->
                    
    <xs:element name="User_Info" maxOccurs="1" minOccurs="1">
                        
    <xs:complexType>
                            
    <xs:sequence>
                                
    <xs:element name="CompanyName" type="xs:string"/>
                                
    <xs:element name="Address" type="xs:string" />
                                
    <xs:element name="PostCode" type="xs:integer" />
                                
    <xs:element name="ContactMan" type="xs:string" />
                                
    <xs:element name="Telephone" type="xs:string" />
                                
    <xs:element name="MobilePhone" type="xs:string" />
                                
    <xs:element name="Email" type="xs:string" />
                                
    <xs:element name="Fax" type="xs:string" />
                                
    <xs:element name="Province" type="xs:integer" />
                                
    <xs:element name="City" type="xs:integer"/>
                                
    <xs:element name="UserType" type="xs:unsignedByte" />
                            
    </xs:sequence>
                        
    </xs:complexType>
                    
    </xs:element>
                
    </xs:sequence>
            
    </xs:complexType>
        
    </xs:element>
    </xs:schema>

    如果客户端的文件如下就可以通过Schema的验证了.
    <Client_Info xmlns="urn:xx-schema">
        
    <User_Info>
            
    <CompanyName>*</CompanyName>
            
    <Address>*</Address>
            
    <PostCode>*</PostCode>
            
    <ContactMan>*</ContactMan>
            
    <Telephone>*</Telephone>
            
    <MobilePhone>*</MobilePhone>
            
    <Email>*@*.*</Email>
            
    <Fax>*</Fax>
            
    <Province>*</Province>
            
    <City>*</City>
            
    <UserType>*</UserType>
        
    </User_Info>
    </Client_Info>
    上面的等价于:
    <Client_Info xmlns="urn:xx-schema">
        <User_Info xmlns="urn:xx-schema">
            
    <CompanyName>*</CompanyName>
            
    <Address>*</Address>
            
    <PostCode>*</PostCode>
            
    <ContactMan>*</ContactMan>
            
    <Telephone>*</Telephone>
            
    <MobilePhone>*</MobilePhone>
            
    <Email>*@*.*</Email>
            
    <Fax>*</Fax>
            
    <Province>*</Province>
            
    <City>*</City>
            
    <UserType>*</UserType>
        
    </User_Info>
    </Client_Info>

    但是客户端如果是下面的情况就无法通过Schema的验证!
    <Client_Info xmlns="urn:xx-schema">
        
    <User_Info xmlns="">
            
    <CompanyName>*</CompanyName>
            
    <Address>*</Address>
            
    <PostCode>*</PostCode>
            
    <ContactMan>*</ContactMan>
            
    <Telephone>*</Telephone>
            
    <MobilePhone>*</MobilePhone>
            
    <Email>*@*.*</Email>
            
    <Fax>*</Fax>
            
    <Province>*</Province>
            
    <City>*</City>
            
    <UserType>*</UserType>
        
    </User_Info>
    </Client_Info>
    原因是User_Info节点多了一个属性为 xmlns.这样就无法通过Schema的验证.

    本来想在Schema的定义时候给User_Info多定义一个xmlns的属性.在Altova XMLSpy验证文件:提示为"不能命名为"xmlns".试了其他的名字都是可以的.看来是关键字的原因吧.

    最后把elementFormDefault="qualified"修改为elementFormDefault="unqualified"就可以通过验证了.

    关于elementFormDefault,MSDN是这样写的:

    在该架构的目标命名空间中声明的属性的形式。该值必须是下列字符串之一:qualified 或 unqualified。默认值为 unqualified。

    如果该值是 unqualified,则无须通过命名空间前缀限定目标命名空间的属性。

    如果该值是 qualified,则必须通过命名空间前缀限定目标命名空间的属性。

    在"chnking"的XSD schema文件中elementFormDefault 属性探讨 里面有这个方面的详细说明.

    MSDN的描述不完整,完整的应该是:

    如果该值是 unqualified,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。

    如果该值是 qualified,实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace


  • 相关阅读:
    LightOJ 1239
    LightOJ 1166 Old Sorting 置换群 或 贪心 水题
    vijos 1243 生产产品 DP + 单调队列优化
    POJ 3348 Cows 凸包 求面积
    POJ 1389 Area of Simple Polygons 扫描线+线段树面积并
    POJ 1151 Atlantis 扫描线+线段树
    POJ 1228 Grandpa's Estate 凸包 唯一性
    bzoj 3622 DP + 容斥
    Uva5211/POJ1873 The Fortified Forest 凸包
    POJ 2007 Scrambled Polygon 极角序 水
  • 原文地址:https://www.cnblogs.com/diego0404/p/808145.html
Copyright © 2011-2022 走看看