应使用不含 simpleContent 的空 complexType 定义元素,使其仅允许子元素或属性、禁止任何字符数据(含空格换行);示例为 。
如果想让某个 XML 元素**完全禁止出现任何文本内容**(即该元素必须为空,不能有字符数据),XSD 中没有直接的“禁止文本”关键字,但可以通过定义一个**不含 simpleContent 的空 complexType**来实现——本质是让元素只允许子元素或属性,但不允许文本。
这是最常用、最明确的方式。只要不声明 simpleContent 或 complexContent 中的文本承载能力,且内部不放 xs:sequence 等含文本的模型,XML 解析器就会拒绝该元素内出现任何字符内容(包括空格和换行)。
这样定义后, 或 都会验证失败;只有 或 才合法。
若你还希望该元素能包含子元素(但依然禁止纯文本),就在空 complexType 内添加结构约束:
xs:sequence + 子元素声明,并确保不设 mixed="true"
(mixed="false" 是默认值,可省略)mixed="true",就又允许文本了,要避免以下方式不能禁止文本,反而可能适得其反:
type="xs:string" 或其他 simpleType → 允许任意文本,不符合目标fixed="xxx" → 要求文本必须等于某值,不是禁止文本default="xxx" → 无文本时补默认值,仍允许文本(无 type)→ 默认为 anyType,等价于允许任意内容(含文本)XML 解析器默认会保留元素内的空白(如换行缩进)。即使你写了空 complexType,像这样
也会报错:
因为中间的换行+缩进被视作字符数据。解决方法有两个:
xs:whiteSpace value="collapse"(但这需包裹在 simpleType 里,与“禁止文本”目标冲突,故不推荐)所以,真正可靠的方案还是坚持用空 complexType,并要求使用者写规范的空标签。
基本上就这些。