以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  有没有人能帮我拍看一下,为什么以下的XML通不过制定的Xml Schema验证  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=56551)


--  作者:jackerlee
--  发布时间:12/9/2007 5:14:00 PM

--  有没有人能帮我拍看一下,为什么以下的XML通不过制定的Xml Schema验证
Xml Content:
<?xml version="1.0" encoding="utf-16"?>
<QueryHotelRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xsi:noNamespaceSchemaLocation="file:///c:/temp/compare.xsd">
  <BasicUserInfo Version="1.0.0">
    <AgentId>test</AgentId>
    <AgentPassword>test_password</AgentPassword>
    <RequestTime>2007-12-09T02:49:03.71875+08:00</RequestTime>
  </BasicUserInfo>
  <BasicCriteria>
    <cityName>Changsha</cityName>
    <BookDate>2007-12-09</BookDate>
    <CheckInDate>2007-12-30</CheckInDate>
    <totalNights>2</totalNights>
    <Rooms>
      <AdultNum>2</AdultNum>
      <Quantity>1</Quantity>
    </Rooms>
  </BasicCriteria>
  <AllocationCriteria>
    <returnAllocationStatus>0</returnAllocationStatus>
  </AllocationCriteria>
  <PriceCriteria>
    <Budget>
      <maxBudget>9999</maxBudget>
      <minBudget>0</minBudget>
    </Budget>
  </PriceCriteria>
  <HotelInfoCriteria>
    <HotelName/>
    <StarLevel>0</StarLevel>
  </HotelInfoCriteria>
</QueryHotelRequest>

Schema Content:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="QueryHotelRequest" type="QueryHotelRequestType">
    <xs:annotation>
      <xs:documentation>query hotel request structure</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="QueryHotelRequestType">
    <xs:complexContent>
      <xs:extension base="BasicRequestType">
        <xs:sequence>
          <xs:element name="BasicCriteria" nillable="false"  type="BasicCriteriaType">
          </xs:element>
          <xs:element name="AllocationCriteria" nillable="false" type="AllocationCriteriaType">
          </xs:element>
          <xs:element name="PriceCriteria" minOccurs="0" maxOccurs="1" type="PriceCriteriaType">
          </xs:element>
          <xs:element name="HotelInfoCriteria" minOccurs="0" maxOccurs="1" type="HotelInfoCriteriaType">
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BasicCriteriaType">
    <xs:annotation>
      <xs:documentation>the basic criteria for query hotel request,all the field are required</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:choice>
        <xs:element name="cityName" maxOccurs="1">
          <xs:annotation>
            <xs:documentation>the destination city name</xs:documentation>
          </xs:annotation>
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="1">
              </xs:minLength>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="airportCode" maxOccurs="1">
          <xs:annotation>
            <xs:documentation>the IATA code</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="airportCode">
                <xs:annotation>
                  <xs:documentation>
                  </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:length value="3" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
      <xs:element name="BookDate">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="^\d{4}-\d{2}-\d{2}$">
            </xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="CheckInDate">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="^\d{4}-\d{2}-\d{2}$">
            </xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="totalNights" type="xs:int">
      </xs:element>
      <xs:element name="Rooms" type="RequestRoomType" minOccurs="1" maxOccurs="5">
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AllocationCriteriaType">
    <xs:sequence>
      <xs:element name="returnAllocationStatus">
        <xs:annotation>
          <xs:documentation>
          </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="0">
              <xs:annotation>
                <xs:documentation>return all the hotel including the on request hotel</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="1">
              <xs:annotation>
                <xs:documentation>return the hotel which only available</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="PriceCriteriaType">
    <xs:sequence>
      <xs:element name="Budget" type="BudgetType">
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BudgetType">
    <xs:sequence>
      <xs:element name="maxBudget" default="99999">
        <xs:simpleType>
          <xs:restriction base="xs:int">
            <xs:minInclusive value="0">
            </xs:minInclusive>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="minBudget" default="1">
        <xs:simpleType>
          <xs:restriction base="xs:int">
            <xs:minInclusive value="0">
            </xs:minInclusive>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="RequestRoomType">
    <xs:sequence>
      <xs:element name="AdultNum">
        <xs:simpleType>
          <xs:restriction base="xs:int">
            <xs:minInclusive value="1">
            </xs:minInclusive>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="Quantity">
        <xs:simpleType>
          <xs:restriction base="xs:int">
            <xs:minInclusive value="1">
            </xs:minInclusive>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="HotelInfoCriteriaType">
    <xs:sequence>
      <xs:element name="HotelName" type="xs:string">
      </xs:element>
      <xs:element name="StarLevel">
        <xs:simpleType>
          <xs:restriction base="xs:float">
            <xs:enumeration value="0">
            </xs:enumeration>
            <xs:enumeration value="1">
            </xs:enumeration>
            <xs:enumeration value="1.5">
            </xs:enumeration>
            <xs:enumeration value="2">
            </xs:enumeration>
            <xs:enumeration value="2.5">
            </xs:enumeration>
            <xs:enumeration value="3">
            </xs:enumeration>
            <xs:enumeration value="3.5">
            </xs:enumeration>
            <xs:enumeration value="4">
            </xs:enumeration>
            <xs:enumeration value="4.5">
            </xs:enumeration>
            <xs:enumeration value="5">
            </xs:enumeration>
            <xs:enumeration value="5.5">
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BasicRequestType">
    <xs:sequence>      
      <xs:element name="BasicUserInfo" type="BasicUserInfoType"></xs:element>
      <xs:element name="RequestType" nillable ="false"
                  minOccurs="1" maxOccurs="1" type="xs:string"></xs:element>
    </xs:sequence>
    <xs:attribute name="Version" type="xs:string" use="required" fixed="1.0.0"/>
  </xs:complexType>
  <xs:complexType name="BasicUserInfoType">
    <xs:sequence>
      <xs:element name="AgentId" type="xs:string" default="">
        <xs:annotation>
          <xs:documentation>Unique reference used to identify the client to Cosmos</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="AgentPassword" type="xs:string" default="">
        <xs:annotation>
          <xs:documentation>maybe encrypt in next version</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="RequestTime" type="xs:dateTime">
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Version" type="xs:string" use="required" fixed="1.0.0"></xs:attribute>
  </xs:complexType>
</xs:schema>


--  作者:lialer
--  发布时间:12/13/2007 9:33:00 PM

--  
检测环境:xp+xmlxpy

在schema中定义了requesttype元素。但


--  作者:lialer
--  发布时间:12/13/2007 9:52:00 PM

--  
检测环境:xp+xmlxpy
问题+答案:
1、在SCHEMA中定义了requestype元素,但在xml中没有写上。应在<BasicCriteria>上之前加<requestType>元素内容。
2、问题出在:<xs:element name="BookDate">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="^\d{4}-\d{2}-\d{2}$">
            </xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="CheckInDate">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="^\d{4}-\d{2}-\d{2}$">
            </xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
按照你的SCHEMA的定义,BookDate和CheckInDate的内容应是"^2007-12-13$"的形式,但在XML中,你写的是“2007-12-13”形式。因而出错。


主要问题是这两个,改了后,在XMLSPY中可以通过。
另外,说一下个人看法:
  1、BookDate和CheckInDate的base用DATE类型会更合你的本意吧,为什么要用string类型呢?
  2、airportCode元素的定义有些重复。

<xs:element name="airportCode" maxOccurs="1">
          <xs:annotation>
            <xs:documentation>the IATA code</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="airportCode">
                <xs:annotation>
                  <xs:documentation>
                  </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:length value="3" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
在airportcode元素里再定义一个airportcode元素,我个人认为这没有必要。
<xs:element name="airportCode" maxOccurs="1">
   <xs:annotation>
      <xs:documentation>the IATA code</xs:documentation>
   </xs:annotation>
   <xs:simpleType>
      <xs:restriction base="xs:string">
          <xs:length value="3"/>
     </xs:restriction>
   </xs:simpleType>
</xs:element>
这是我改过的。     
  


--  作者:jackerlee
--  发布时间:12/14/2007 11:06:00 AM

--  谢谢了!
1.确实没有RequestType的内容,加上就好了
2.BookDate使用字符串而不是日期考虑到时区问题
3.IATA Code属于输入错误
--  作者:lialer
--  发布时间:12/16/2007 10:26:00 AM

--  
"BookDate使用字符串而不是日期考虑到时区问题"
学到了东西.谢谢分享.

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
156.250ms