Допустим ли этот 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.

Другие вопросы по тегам