XML Schema验证报错:元素不可含空白内容模型为空求排查
问题分析与解决方案
首先,咱们来拆解这个错误提示:The element cannot contain white space. Content model is empty. 它的意思是你定义的某个元素被设置为「空内容模型」——也就是只能携带属性,绝对不能包含任何子元素、文本甚至空白字符,但你的XML里这个元素偏偏包含了子节点,所以验证失败。
具体问题出在哪?
看你的XSD定义:
<xs:complexType name="configuration"> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="description" type="xs:string" use="required"/> <xs:attribute name="deployDir" type="xs:anyURI" use="optional" default="xs:"/> </xs:complexType>
这个configuration复杂类型只定义了属性,没有任何内容模型(比如<xs:sequence>、<xs:element>这类用来声明子元素的节点),所以XML Schema默认会把它判定为empty content——也就是说,<configuration>元素必须是空的,比如写成:
<configuration xmlns="urn://Test.Deploy" id="Test deploy" description="Test deploy server" deployDir="../Deploy"/>
但你的实际XML里,<configuration>里面嵌套了<services>子元素,这就直接违反了XSD的约束,触发了那个验证异常。
另外还有个潜在问题:你的XSD里services类型定义的<service>元素是:
<xs:element name="service" type="service" minOccurs="0" nillable="true" />
这里没有设置maxOccurs,默认值是1,意味着<services>里最多只能有1个<service>元素,但你的XML里有2个,后续验证也会报错,这个也得一起修正。
修正后的XSD
我们需要给configuration类型添加内容模型,声明它可以包含一个<services>子元素,同时调整services里<service>的出现次数限制:
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="urn://Test.Deploy" elementFormDefault="qualified" xmlns="urn://Test.Deploy" xmlns:mstns="urn://Test.Deploy" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="configuration"> <!-- 添加内容模型,声明configuration可以包含一个services子元素 --> <xs:sequence> <xs:element name="services" type="services" /> </xs:sequence> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="description" type="xs:string" use="required"/> <xs:attribute name="deployDir" type="xs:anyURI" use="optional" default="xs:"/> </xs:complexType> <xs:complexType name="service"> <xs:attribute name="name" type="xs:string" use="required" /> <xs:attribute name="order" type="xs:string" use="optional" /> <xs:attribute name="version" type="xs:string" use="optional" /> </xs:complexType> <xs:complexType name="services"> <xs:sequence> <!-- 设置maxOccurs="unbounded",允许多个service元素 --> <xs:element name="service" type="service" minOccurs="0" maxOccurs="unbounded" nillable="true" /> </xs:sequence> <xs:attribute name="environment" use="required" /> <xs:attribute name="version" use="required" /> </xs:complexType> <xs:element name="configuration" type="configuration"/> <xs:element name="services" type="services" /> </xs:schema>
用这个修正后的XSD去验证你的XML,就能顺利通过了。
内容的提问来源于stack exchange,提问作者StuiterSlurf
相关产品推荐
相关产品推荐

