这个XML是否有效,以及如何使用TXMLDocument创建它

时间:2012-08-01 15:21:47

标签: xml delphi 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>节点一样。

如何使用TXMLDocument解析<p>的三个值?以及如何遍历<span>节点?

最后......如何使用TXMLDocument ????

创建这样的XML文档

帮助!

2 个答案:

答案 0 :(得分:6)

当你说,它是否有效时,我认为你的意思是:它是否形成良好? (如果没有DTD或架构,我们无法判断它是否有效。)

是的,形式良好。它是包含混合内容的文档的完美正常示例,这是XML的设计目的。

我无法回答你关于TXMLDocument的问题,因为我从未听说过它:大概它是delphi XML库的一部分。

答案 1 :(得分:6)

是的,它是有效的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>个节点有自己的AttributeNodesChildNodes列表,依此类推。因此,为了解析这个问题,您将遍历树,寻找#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时,默认情况下会删除不必要的空格。如果要保留它,请在加载XML之前在poPreserveWhiteSpace属性中启用ParseOptions标志。