Допустим ли этот XML и как его создать с помощью TXMLDocument
Является ли этот XML "действительным"?
<?xml version="1.0"?>
<p class="leaders">
Todd
<span class="leader-type">.</span>
R
<span class="leader-type">.</span>
Colas
</p>
Я никогда не видел документ XML с несколькими "значениями" для узла, как это делает для <p>
узел.
Как мне разобрать три значения для <p>
с TXMLDocument? И как пройти к <span>
узлы?
Наконец... как мне создать XML-документ, подобный этому, с помощью TXMLDocument????
Помогите!!!!
2 ответа
Когда вы говорите, это действительно, я думаю, что вы имеете в виду: это правильно сформировано? (Мы не можем сказать, допустимо ли это без DTD или схемы).
Да, это правильно сформировано. Это совершенно нормальный пример документа, содержащего смешанный контент, для которого и предназначен XML.
Я не могу ответить на ваши вопросы о TXMLDocument, потому что я никогда о нем не слышал: предположительно, это часть библиотеки Delphi XML.
Да, это действительно XML. Чтобы разобрать его, вы должны понимать, что XML представлен в виде дерева узлов. Этот XML будет разбираться в следующую древовидную структуру.
p
|_ attributes
| |_ "class"="leaders"
|
|_ children
|_ #text "Todd"
|
|_ span
| |_ attributes
| | |_ "class"="leader-type"
| |
| |_ children
| |_ #text "."
|
|_ #text "R"
|
|_ span
| |_ attributes
| | |_ "class"="leader-type"
| |
| |_ children
| |_ #text "."
|
|_ #text "Colas"
Каждый атрибут и дочерний узел представлен как отдельный IXMLNode
интерфейс в TXMLDocument
, Как видите, части открытого текста разделены на свои #text
узлы.
Как только вы загрузили XML в TXMLDocument
, TXMLDocument.DocumentElement
свойство представляет <p>
узел. Этот узел AttributeNodes
Свойство содержит узел "класс", и его ChildNodes
свойство содержит первый уровень #text
а также <span>
узлы. <span>
узлы имеют свои AttributeNodes
а также ChildNodes
списки и тд. Чтобы разобрать это, вы должны пройтись по дереву в поисках #text
узлы, используя <span>
узлы для манипулирования текстом по мере необходимости.
Чтобы создать такой документ, вы просто создаете отдельные узлы по мере необходимости, например:
Doc.Active := False;
Doc.Active := True;
Node := Doc.AddChild('p');
Node.Attributes['class'] := 'leaders';
Child := Doc.CreateNode('Todd', ntText);
Node.ChildNodes.Add(Child);
Child := Node.AddChild('span');
Child.Attributes['class'] := 'leader-type';
Child.Text := '.';
Child := Doc.CreateNode('R', ntText);
Node.ChildNodes.Add(Child);
Child := Node.AddChild('span');
Child.Attributes['class'] := 'leader-type';
Child.Text := '.';
Child := Doc.CreateNode('Colas', ntText);
Node.ChildNodes.Add(Child);
Doc.SaveTo...(...); // generate the XML to your preferred output
Если вы хотите, чтобы в выводе XML появлялись пробелы / переносы строк, просто включите эти символы в содержимое #text
узлы. При разборе XML в TXMLDocument
ненужные пробелы по умолчанию удаляются. Если вы хотите сохранить его, включите poPreserveWhiteSpace
флаг в ParseOptions
свойство перед загрузкой XML.