我試圖驗證以下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>
非常感謝,我只是沒有看到區別。特別是對於我來說,由於更多的限制,我使用type =「NameType」,但這仍然是一種奇怪的行爲。 –