Я хотел проверить, какие разные варианты "empty" на самом деле пусты.
Вариация A
<Santa/>
дает дерево
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
Вариация B
<Santa></Santa>
дает дерево DOM:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
Вариация C
<Santa>
Space </Santa>
дает дерево DOM:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
Вариация D
<Santa>
Tab </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 " "
Интересный; это не круто.
Force TAB CRLF
XmlDocument doc = new XmlDocument();
XmlElement santa = doc.appendChild(doc.CreateElement("Santa"));
santa.appendChild(doc.CreateText(TAB+LF+CR));
Он выглядит как XML:
<?xml version="1.0"?>
<Santa><kbd>TAB</kbd><kbd>LF</kbd>
<kbd>CR</kbd>
</Santa>
с деревом DOM:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
|- NODE_TEXT #text "\t\n\n"
Да, XML преобразует все CR в LF , и да, он не может быть использован для округления. Если вы анализируете:
<?xml version="1.0"?>
<Santa><kbd>TAB</kbd><kbd>LF</kbd>
<kbd>CR</kbd>
</Santa>
вы получите дерево DOM:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT Santa ""
Настройка element.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:
<?xml version="1.0"?>
<Santa><kbd>LF</kbd>
<kbd>TAB</kbd><kbd>LF</kbd>
</Santa>
Итак, то, что они сказали вам, было правдой с определенной точки зрения.
- строка xml, содержащая только пробелы в элементе, будет пустой при анализе
- элемент DOM, который содержит только пробел в своем текстовом узле, будет отображать пробел при преобразовании в строку XML