这个xml是有效的吗?

use*_*737 0 xml xml-parsing

我和我的同事陷入了关于xml有效性的争论.我非常有信心xml节点可以有文本节点或其他xml节点,但不能同时具有:

换句话说 - 这是一个有效的xml吗?(我说这不是)

<dt>
    blah blah text   
    <test0>
        some node content
    </test0>
    <test1>
        blah blah some text <some_node>A</some_node>
    </test1>
    <test2>
        noncount
    </test2>
    <test3>
        blah blah some text <some_node>B</some_node>
    </test3>
</dt>
Run Code Online (Sandbox Code Playgroud)

编辑:我的同事辩称,因为.dtd文件中有#PCDATA,所以:

<!ELEMENT dt (#PCDATA | test0 | test1 | test2 | test3)* >
Run Code Online (Sandbox Code Playgroud)

这意味着它内部可能还有其他xml标签以及文本.

Sha*_*nce 6

XML在有条理的东西和有效的东西之间存在区别.有时人们说他们的意思是良好的形式是有效的,这是令人困惑的.XML是一组用于构造词汇表的语法规则.就其自身而言,XML没有说明允许哪些元素和属性,或者您可以放置​​它们的位置.如果文档遵循XML语法,那么它就是格式良好的.您的示例是格式良好的XML.

有效性意味着所使用的特定元素和属性都是根据某些DTD或模式使用的.您举了这个示例DTD片段:

<!ELEMENT dt (#PCDATA | test0 | test1 | test2 | test3)* >
Run Code Online (Sandbox Code Playgroud)

您的同事是正确的,根据该DTD您给出的XML是有效的(当然,假设所有测试元素的内容都是有效的).如果你的DTD看起来像这样:

<!ELEMENT dt (test0 | test1 | test2 | test3)* >
Run Code Online (Sandbox Code Playgroud)

那么你的例子将无效,但它仍然是格式良好的.

在实际操作中,混合文本和子元素是非常常见的.