XSD技术问询:允许元素仅含空白字符及空元素空白内容报错问题
解决XSD中允许元素内容仅为空白字符的问题
咱们先从你的具体代码问题入手,再讲通用的配置方法。
你的具体案例解决方案
你当前的ViewElement复杂类型默认是空内容模型(因为没有定义任何内容节点),所以XML解析器会拒绝任何内容,包括空白字符。要让<VIEW Name='V_UP'> </VIEW>这种带空白的元素通过验证,你需要修改complexType的定义,允许空白内容。
方案1:允许元素包含空白或空内容(同时兼容非空白内容)
如果你只是想兼容空白内容,不限制非空白文本,可以给complexType添加xs:simpleContent扩展字符串类型:
<xs:complexType name="ViewElement"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Name" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:element name="VIEW" type="ViewElement" minOccurs="0" maxOccurs="unbounded"/>
修改后,空内容、空白内容、甚至带文本的内容都能通过验证。
方案2:严格限制元素内容仅为空白字符(禁止非空白文本)
如果你需要严格保证元素内容只能是空白字符(空格、制表符、换行等)或空内容,可以先定义一个自定义简单类型,再扩展它:
<!-- 定义仅允许空白字符的简单类型 --> <xs:simpleType name="WhitespaceOnlyType"> <xs:restriction base="xs:string"> <!-- \s* 匹配零个或多个空白字符 --> <xs:pattern value="\s*"/> </xs:restriction> </xs:simpleType> <xs:complexType name="ViewElement"> <xs:simpleContent> <xs:extension base="WhitespaceOnlyType"> <xs:attribute name="Name" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:element name="VIEW" type="ViewElement" minOccurs="0" maxOccurs="unbounded"/>
这个方案下,只有空内容、纯空白内容的<VIEW>元素能通过验证,带非空白文本的会被拒绝。
通用配置方法:XSD中允许元素内容仅为空白字符
如果是其他场景需要配置元素仅允许空白内容,核心思路是:
- 定义一个自定义简单类型,通过
xs:pattern规则限制内容为\s*(零或多个空白字符) - 如果元素是仅含文本(无属性):直接将元素类型设为这个自定义类型即可
- 如果元素带属性:使用
xs:simpleContent扩展这个自定义类型,同时添加属性定义
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

