代码之家  ›  专栏  ›  技术社区  ›  AndrewC

在架构中包含子节点和文本的停止节点

  •  0
  • AndrewC  · 技术社区  · 15 年前

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

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

    文本,只是子节点 文本。

    我使用这个xml的程序是在.NET中编写的,所以我也会标记它,以防在.NET中有任何有用的东西可以用于此,尽管我更希望这个问题是在模式本身中修复的。

    干杯

    1 回复  |  直到 15 年前
        1
  •  1
  •   mjv    15 年前

    编辑:在重读问题时,OP希望使用XSD,而不是DTD(顺便说一句,这是件好事!)。我最初认为DTD是被要求的;以下是xmlschema(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>
    

    mixed="false" 添加到complexTypes的属性是多余的,因为默认情况下complexType混合模式为false(因此,默认情况下,防止元素和元素之间的文本混合)


    (原始答案,改为DTD)
    下面的DTD将阻止这种情况。请注意,mysubnode只能包含一个子节点,没有PCDATA w/r mysubnode的引用,因此问题中XML片段的“更多文本”将是无效的。

    <!ELEMENT mynode (mysubnode)>
    <!ELEMENT mysubnode  (mysubsubnode)>
    <!ELEMENT mysubsubnode (#PCDATA)>
    

    <!ELEMENT mynode (mysubnode)>
    <!ELEMENT mysubnode   (#PCDATAT | mysubsubnode)>
    <!ELEMENT mysubsubnode (#PCDATA)>