【发布时间】:2014-12-25 22:48:42
【问题描述】:
我试图弄清楚<xs:unique> 约束是如何工作的,作为其中的一部分,我认为是否可以创建一些违反其关联架构中的<xs:unique> 约束的XML 是值得的。所以我在schema.xml 中有这个架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="parent">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="child">
<xs:complexType>
<xs:attribute name="foo" type="xs:string" />
</xs:complexType>
<xs:unique name="someUniqueConstraint">
<xs:selector xpath="child" />
<xs:field xpath="@foo" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
还有这个文件在data.xml:
<parent>
<child foo="1" />
<child foo="2" />
<child foo="2" />
</parent>
我正在使用 Python 的 lxml 库进行验证,它是 libxml2 的绑定:
from lxml import etree
# load and parse schema and xml
with open('schema.xml', 'r') as f:
schema_root = etree.parse(f)
with open('data.xml', 'r') as f:
data_root = etree.parse(f)
schema = etree.XMLSchema(schema_root)
schema.assertValid(data_root)
我的期望是上面的验证代码应该在schema.assertValid 行上引发异常,因为违反了<child> 标签的foo 属性的唯一性约束。但是,这不会发生 - 断言成功。
我猜是 1.) 我写错了 <xs:unique> 约束;或 2.) lxml 和/或 libxml2 实际上并不进行唯一性验证。无论哪种方式,我应该做些什么不同的事情来让lxml 强制执行唯一性约束,以便它不将上面的文档视为有效?
(我已经设法从各种其他模式违规中消除了 lxml 的验证错误,所以并不是我安装的 lxml 被破坏或其他原因。)
【问题讨论】: