根据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)
有趣; 它不是圆形的.
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将所有内容转换CR为LF,是的,它不是圆形的.如果你解析:
<?xml version="1.0"?> <Santa>TABLF CR </Santa>
您将获得以下DOM树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
Run Code Online (Sandbox Code Playgroud)
最后,我们来看看如果通过它的.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>
从某种角度来看,他们告诉你的是真的.
<element />
Run Code Online (Sandbox Code Playgroud)
和
<element></element>
Run Code Online (Sandbox Code Playgroud)
都是空元素.必须将标准中的任何产品解释为具有此结果.
| 归档时间: |
|
| 查看次数: |
54137 次 |
| 最近记录: |