我想检查 "empty" 的哪些不同变体实际上是空的。
变体 A
<Santa/>
给出一棵树
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
变体 B
<Santa></Santa>
给出一个 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
变体 C
<Santa>空格</Santa>
给出一个 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
变体 D
<Santa>标签</Santa>
给出一个 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
变体 E
<Santa>CRLF
</Santa>
给出一个 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
文本的所有变体都给出相同的 DOM 树。当一个 XML 文档被要求序列化自己时,DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
序列化文本的结果:
<?xml version="1.0"?>
<Santa/>
手动添加空文本节点
我想看看如果我构建 DOM 树会发生什么:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text ""
使用伪代码:
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(""));
当该 DOM 文档保存到流中时,它会显示为:
<?xml version="1.0"?>
<Santa/>
即使元素被强制有一个子元素(即强制不为空),DOM 也会将其设为空。
强制文本节点带有空格
然后,如果我确保在 TEXT 节点中添加一些空格:
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(" "));
它以 XML 形式出现:
<?xml version="1.0" ?>
<Santa> </Santa>
使用 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text " "
有趣;它不能往返。
强制使用 TAB CRLF
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(TAB+LF+CR));
它以 XML 形式出现:
TABLF
CR
圣诞老人>
使用 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text "\t\n\n"
是的,XML 将所有 CR 转换为 LF,是的,它不是可往返的。如果你解析:
TABLF
CR
圣诞老人>
你会得到以下的 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
设置元素.text
最后我们来看看如果你通过它的.text 属性设置一个元素的文本会发生什么。
不设置文字:
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
//santa.text = ""; example where we don't set the text
给出 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
和 XML:
<?xml version="1.0"?>
<Santa/>
设置空文本
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = ""; //example where we do set the text
给出 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text ""
和 XML:
<?xml version="1.0"?>
<Santa/>
设置单个空格
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = " ";
给出 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text " "
和 XML:
<?xml version="1.0"?>
<Santa> </Santa>
设置更多的空白
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.text = LF+TAB+CR;
给出 DOM 树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text "\n\t\n"
和 XML:
LF
TABLF
圣诞老人>
所以从某种角度来看,他们告诉你的是真的。
- 元素中仅包含空格的 xml 字符串在解析时将为空
- 文本节点中仅包含空格的 DOM 元素在转换为 xml 字符串时将呈现空格