use*_*879 4 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>
Run Code Online (Sandbox Code Playgroud)
我从来没有见过像这样的节点有多个"值"的XML文档<p>.
如何解析<p>TXMLDocument 的三个值?以及如何遍历<span>节点?
最后......如何使用TXMLDocument创建这样的XML文档????
救命!!!!
当你说,它是否有效时,我认为你的意思是:它是否形成良好?(如果没有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"
Run Code Online (Sandbox Code Playgroud)
每个属性和子节点都表示为一个单独的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
Run Code Online (Sandbox Code Playgroud)
如果要在XML输出中显示空格/换行符,只需将这些字符包含在#text节点的内容中即可.在解析XML TXMLDocument时,默认情况下会删除不必要的空格.如果要保留它,请在加载XML之前poPreserveWhiteSpace在ParseOptions属性中启用该标志.