以下python脚本包含一个简单的XML模式,用于定义元素' a'整数类型和包含此类元素的XML文档。根据模式验证文档时,验证失败。
from lxml import etree
from StringIO import StringIO
xmlschema = etree.XMLSchema(etree.parse(StringIO('''\
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="a" type="xsd:int"/>
</xsd:schema>
''')))
xmldoc = etree.parse(StringIO("<a> 42</a>"))
print xmlschema.validate(xmldoc)
使用xmllint验证时会发生同样的故障:
$ xmllint --schema test_schema.xml test_doc.xml
<?xml version="1.0"?>
<a> 42</a>
test_doc.xml:1: element a: Schemas validity error : Element 'a': ' 42' is not a valid value of the atomic type 'xs:int'.
test_doc.xml fails to validate
根据XML Schema Part 2: Datatypes Second Edition, section 4.3.6所有原子数据类型除了&#39; string&#39;拥有他们的“whiteSpace”&#39;约束设置为&#39;崩溃&#39;所以元素&#39; a&#39;应该是有效的。
修改架构以明确设置&#39; whiteSpace&#39;崩溃&#39;没有帮助:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="myint">
<xsd:restriction base="xsd:int">
<xsd:whiteSpace value="collapse"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="a" type="myint"/>
</xsd:schema>
我在Stackoverflow上发现了与数据类型dateTime(dateTime complaining about whiteSpace in XSD validation (lxml))相关的类似问题,遗憾的是没有解决方案。
所以我的问题是: