什么是空元素?

Rol*_*man 22 xml dom

根据XML规范,这是一个空元素的定义:

没有内容的元素被认为是空的.]空元素的表示是紧跟在结束标记之后的开始标记,或者是空元素标记.

(见:http://www.w3.org/TR/REC-xml/#NT-content)

现在,我对理解空元素标签没有任何问题:<i-am-empty/>并且不存在任何误解.但在我看来,标准在另一种情况下自相矛盾:一方面,它表示任何不带标签content都是空的,另一方面它表示这可以用一个开始标记表示,然后立即结束 -标签.但是如果我们看一下这个定义content:

[43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
Run Code Online (Sandbox Code Playgroud)

在我看来,它content由两个可选部分CharData?和一个组组成()*.但由于这两个部分都是可选的,因此它意味着没有任何东西(如没有字符)与此产品相匹配.因此,如果我试图将这个内容的定义与内部的任何内容相匹配,<am-i-empty-or-not></am-i-empty-or-not>我将获得积极的匹配.所以,一方面这是一个空标签,因为它是"一个开始标签后紧跟一个结束标签",另一方面它不是空的,因为在标签之间我可以积极地匹配生产规则的定义[对于内容,在这种情况下它包含内容,这意味着它不能为空.

任何人都能解释哪些规则优先吗?有没有人知道任何对此有不同意见的DOM或解析器实现?

Thi*_*ilo 12

但由于这两个部分都是可选的,因此它意味着没有任何东西(如没有字符)与此产品相匹配.

这可能是真的,但关于这个问题的规范中的措辞非常明确.在下一段中甚至有空元素的例子.

<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />
<br></br>
<br/>
Run Code Online (Sandbox Code Playgroud)

所以唯一的方法(在这种情况下,用周围的措辞和例子)来阅读

没有内容的元素

将包括"(在匹配生产时)完全为空的内容"(即零长度,甚至不是空白).


Ian*_*oyd 11

我想检查"空"的不同变体实际上是空的.

变异A.

<Santa/>

给了一棵树

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

变化B.

<Santa></Santa>

给出一个DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

变化C.

<Santa>Space</Santa>

给出一个DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

变化D.

<Santa>Tab</Santa>

给出一个DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

变异E.

<Santa>CRLF
</Santa>

给出一个DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

文本的所有变体都提供相同的DOM树.当要求XML文档自行序列化时,DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

结果序列化文本:

<?xml version="1.0"?>
<Santa/>
Run Code Online (Sandbox Code Playgroud)

手动添加空文本节点

我想看看如果我构建DOM树会发生什么:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text ""
Run Code Online (Sandbox Code Playgroud)

使用伪代码:

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(""));
Run Code Online (Sandbox Code Playgroud)

当该DOM文档保存到流中时,它将显示为:

<?xml version="1.0"?>
<Santa/>
Run Code Online (Sandbox Code Playgroud)

即使元素被强制拥有子元素(即强制不为空),DOM也会将其视为空.

使用空格强制文本节点

然后,如果我确保在TEXT节点中放入一些空格:

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(" "));
Run Code Online (Sandbox Code Playgroud)

它以XML形式出现:

<?xml version="1.0" ?>
<Santa> </Santa>
Run Code Online (Sandbox Code Playgroud)

使用DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text " "
Run Code Online (Sandbox Code Playgroud)

有趣; 它不是圆形的.

强制使用TAB CRLF

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(TAB+LF+CR));
Run Code Online (Sandbox Code Playgroud)

它以XML形式出现:

<?xml version="1.0"?>
<Santa>TABLF
CR    
</Santa>

使用DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text "\t\n\n"
Run Code Online (Sandbox Code Playgroud)

是的,XML将所有内容转换CRLF,是的,它不是圆形的.如果你解析:

<?xml version="1.0"?>
<Santa>TABLF
CR   
</Santa>

您将获得以下DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

设置element.text

最后,我们来看看如果通过它的.text属性设置元素的文本会发生什么.

没有文字:

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
//santa.text = ""; example where we don't set the text
Run Code Online (Sandbox Code Playgroud)

给出DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)

和XML:

<?xml version="1.0"?>
<Santa/>
Run Code Online (Sandbox Code Playgroud)

设置空文本

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = ""; //example where we do set the text
Run Code Online (Sandbox Code Playgroud)

给出DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text ""
Run Code Online (Sandbox Code Playgroud)

和XML:

<?xml version="1.0"?>
<Santa/>
Run Code Online (Sandbox Code Playgroud)

设置单个空间

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = " ";
Run Code Online (Sandbox Code Playgroud)

给出DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text " "
Run Code Online (Sandbox Code Playgroud)

和XML:

<?xml version="1.0"?>
<Santa> </Santa>
Run Code Online (Sandbox Code Playgroud)

设置更多whitepsace

XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = LF+TAB+CR;
Run Code Online (Sandbox Code Playgroud)

给出DOM树:

|- NODE_DOCUMENT #document ""
   |- NODE_ELEMENT Santa ""
      |- NODE_TEXT #text "\n\t\n"
Run Code Online (Sandbox Code Playgroud)

和XML:

<?xml version="1.0"?>  
<Santa>LF
TABLF
</Santa>

从某种角度来看,他们告诉你的是真的.

  • 解析时,只包含元素中空格的xml字符串将为空
  • 在其文本节点中仅包含空格的DOM元素将在转换为xml字符串时呈现空白


Joh*_*ers 7

<element />
Run Code Online (Sandbox Code Playgroud)

<element></element>
Run Code Online (Sandbox Code Playgroud)

都是空元素.必须将标准中的任何产品解释为具有此结果.

  • @JohnSaunders不,他既没有误读也没有误解.该规范自相矛盾,特别是[43]与"定义"和例子相矛盾. (2认同)