如果我有这样的xml:
<mynode>
<mysubnode>
<mysubsubnode>hello world</mysubsubnode>
some more text
</mysubnode>
</mynode>
如您所见,mysubnode
包含子节点和一些文本数据。
我想知道的是,是否可以防止在架构中发生这种情况?我不希望节点包含子节点和文本,只包含子节点或文本。
我的xsd中是否有一个选项可以指定强制执行此操作?
我使用这个xml的程序是用.NET编写的,所以我也会标记它,因为我可以在.net中使用任何东西,但我更倾向于修复问题在模式本身。
干杯
答案 0 :(得分:1)
编辑:在重新阅读问题时,OP期望使用XSD,而不是DTD(顺便说一下,这是件好事!)。我虽然要求提供DTD,但我是最初的;这是XML Schema(XSD)版本
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="mysubnodetype" mixed="false">
<xs:sequence>
<xs:element name="mysubsubnode" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mynodeType" mixed="false">
<xs:sequence>
<xs:element name="mysubnode" type="mysubnodetype"/>
</xs:sequence>
</xs:complexType>
<xs:element name="mynodeType" type="mynodeType"/>
</xs:schema>
注意:添加到complexTypes的mixed="false"
属性是多余的,因为默认情况下complexType混合模式为false(因此,默认情况下,防止元素和文本在元素之间混合。)
(原始答案,改为使用DTD)
以下DTD可以防止这种情况发生。请注意,mysubnode只能包含子子节点,没有PCDATA w / r mysubnode的引用,因此问题中XML片段的“更多文本”将无效。
<!ELEMENT mynode (mysubnode)>
<!ELEMENT mysubnode (mysubsubnode)>
<!ELEMENT mysubsubnode (#PCDATA)>
要使问题的XML片段有效,需要使用类似的内容
<!ELEMENT mynode (mysubnode)>
<!ELEMENT mysubnode (#PCDATAT | mysubsubnode)>
<!ELEMENT mysubsubnode (#PCDATA)>