这个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创建这样的Finally...how文档吗?
救命!
发布于 2012-08-02 00:00:55
当你说,它是否有效时,我想你的意思是:它结构良好吗?(如果没有DTD或模式,我们无法判断它是否有效)。
是的,它的格式很好。这是一个包含混合内容的文档的完美普通示例,而XML正是为此而设计的。
我不能回答您关于TXMLDocument的问题,因为我从来没有听说过它:大概它是delphi XML库的一部分。
发布于 2012-08-02 02:53:31
是,它是有效的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"每个属性和子节点在TXMLDocument中表示为单独的IXMLNode接口。如您所见,纯文本部分被分隔到各自的#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时,默认情况下会去掉不必要的空格。如果要保留它,请在加载XML之前启用ParseOptions属性中的poPreserveWhiteSpace标志。
https://stackoverflow.com/questions/11762410
复制相似问题