停止包含子模式和模式中的文本的节点

时间:2010-04-02 14:37:30

标签: .net xml xsd

如果我有这样的xml:

<mynode>
    <mysubnode>
        <mysubsubnode>hello world</mysubsubnode>
        some more text
    </mysubnode>
</mynode>

如您所见,mysubnode包含子节点和一些文本数据。

我想知道的是,是否可以防止在架构中发生这种情况?我不希望节点包含子节点文本,只包含子节点文本。

我的xsd中是否有一个选项可以指定强制执行此操作?

我使用这个xml的程序是用.NET编写的,所以我也会标记它,因为我可以在.net中使用任何东西,但我更倾向于修复问题在模式本身。

干杯

1 个答案:

答案 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)>