我尝试使用同一文件夹中的后续 xsd 文件验证以下 XML。根据 Altova XMLSpy,这是完全有效的,但为了帮助一些没有许可证的同事找出基本错误,我尝试使用 python 和“lxml.etree”以及 xmllint 验证文件。这两个说 xml 无效并带有相同的消息:
machineDB.xml:20:模式有效性错误:元素“canframe”:未找到 keyref 'busRef' 的键序列 ['remotebus'] 的匹配项。machineDB.xml 无法验证
有人可以帮忙找出任何人的错吗?
版本:
Altova XMLSpy 专业版 2016 版本。2 sp1 (x64)
lxml.etree 版本
Python : sys.version_info(major=2, minor=7, micro=11, releaselevel='final', serial=0) lxml.etree : (3, 7, 2, 0) libxml used : (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>