2017-01-26 43 views
3

我試圖驗證以下XML與以下xsd文件在同一文件夾中。根據Altova XMLSpy的說法,這是完全有效的,但是爲了幫助一些沒有許可證的同事發現基本錯誤,我嘗試使用python和'lxml.etree'驗證文件,並使用xmllint進行驗證。這兩個表示xml對於相同的消息無效:誰是對的,誰做錯誤的驗證(我,XMLSpy,lxml.etree或xmllint)

machineDB.xml:20:模式有效性錯誤:元素'canframe':找不到keyref'busRef'的鍵序列''remotebus' 。 machineDB.xml無法驗證

有人可以幫助找到任何人的錯?


版本:

Altova的XMLSpy的專業版版2016版本。 2 SP1(64)

lxml.etree版本

的Python:sys.version_info(主要= 2,次要= 7,微= 11, releaselevel = '最終',串行= 0)LXML。 etree:(3,7,2,0) 使用的libxml:(2,9,4)編譯的libxml:(2,9,4) 使用的libxslt:(1,1,29)libxslt編譯爲:(1,1 ,29)

xmllint(使用的libxml版本20708)

machineDB.xml文件:

<machinedb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="machinedb.xsd"> 
    <busdefinition> 
     <bus name="displaybus"></bus> 
     <bus name="remotebus"></bus> 
    </busdefinition> 
    <cdefinition> 
     <c> 
      <canbus bus_ref="remotebus"></canbus> 
      <canbus bus_ref="displaybus"></canbus> 
     </c> 
     <c> 
      <canbus bus_ref="displaybus"></canbus> 
     </c> 
     <c> 
      <canbus bus_ref="remotebus"></canbus> 
     </c> 
    </cdefinition> 
    <sdefinition> 
     <s> 
      <canframe bus_ref="remotebus"></canframe> 
     </s> 
    </sdefinition> 
</machinedb> 

machinedb.xsd文件:

<xs:schema xmlns:altova="http://www.altova.com/xml-schema-extensions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> 
    <xs:element name="machinedb"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="busdefinition" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="bus" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:attribute name="name" type="NameType" use="required"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="cdefinition" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="c" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
             <xs:choice> 
              <xs:element name="canbus" minOccurs="0" maxOccurs="unbounded"> 
               <xs:complexType> 
                <xs:attribute name="bus_ref" type="NameType" use="required"/> 
               </xs:complexType> 
              </xs:element> 
             </xs:choice> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="sdefinition" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="s" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
             <xs:choice> 
              <xs:element name="canframe" minOccurs="0" maxOccurs="unbounded"> 
               <xs:complexType> 
                <xs:attribute name="bus_ref" use="required"/> 
               </xs:complexType> 
              </xs:element> 
             </xs:choice> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:key name="busKey"> 
      <xs:selector xpath="busdefinition/bus"/> 
      <xs:field xpath="@name"/> 
     </xs:key> 
     <xs:keyref name="busRef" refer="busKey"> 
      <xs:selector xpath="cdefinition/c/canbus |sdefinition/s/canframe"/> 
      <xs:field xpath="@bus_ref"/> 
     </xs:keyref> 
    </xs:element> 
    <xs:simpleType name="NameType"> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="[\w_]+"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

回答

2

有趣的問題。問題消失,如果你設置的bus_reftypecanbusxs:string沒有自定義的限制(見this question):

<xs:attribute name="bus_ref" type="xs:string" use="required"/> 
<!--...--> 
<xs:attribute name="bus_ref" use="required" type="xs:string"/> 

認爲(野生猜測),這是使用的libxml工具的特定缺陷而且Xerces和Saxon的行爲是正確的。

+0

非常感謝,我只是沒有看到區別。特別是對於我來說,由於更多的限制,我使用type =「NameType」,但這仍然是一種奇怪的行爲。 –

1

該架構包含屬性

vc:minVersion="1.1" 

這表明它是一個XSD 1.1架構。使用Liquid XML進行驗證我得到以下結果

使用.Net驗證閱讀器報告它是有效的。 .Net解析器是一個XSD 1.0解析器,並且不知道vc:minVersion屬性,因此只是忽略它,將其視爲1.0架構

使用.Xerces在XSD 1.0模式下驗證它無法驗證。Xerces知道vc:minVersion屬性,並且因此忽略模式,因爲它不在1.1模式下。

使用.Xerces在XSD 1.1模式下驗證它驗證。 Xerces知道vc:minVersion,並可以使用XSD 1.1標準進行驗證,並認爲一切正常。

其他不支持XSD 1.1的解析器可能無論如何。

可以肯定的是,我不認爲架構包含1.1特定的任何東西(語法或功能),所以我不知道爲什麼它被標記爲1.1架構。

但是回到你遇到的錯誤,我認爲這是你正在使用的解析器的一個怪癖。

+0

由於架構中沒有任何內容是XSD 1.1,您爲什麼認爲版本信息與OP所收到的錯誤有關?謝謝! –

+0

從技術上講,如果驗證程序不符合1.1規範(只要它看到屬性vc:minVersion =「1.1」,應該忽略該元素的其餘部分),驗證程序甚至不應該看到該模式。我基本上提供了一些主要解析器的結果,其他解析器如何處理MinVersion標記是未知的。正如最後所說,我認爲問題在於你嘗試的解析器不是schema/xml組合。但是可能你會發現在其他1.0解析器上使用這個模式的問題。 – Sprotty