如何在 Delphi 中获取实际 IXMLNode 的完整路径?
Posted
技术标签:
【中文标题】如何在 Delphi 中获取实际 IXMLNode 的完整路径?【英文标题】:How to get full path of actual IXMLNode in Delphi? 【发布时间】:2022-01-15 22:29:39 【问题描述】:我创建了一个递归函数,它将所有 XML 节点名称和值添加到 TMemo
。但我需要拥有每个节点的完整 XPath。现在我可以添加父节点的名称,但不能添加完整路径。需要这样的东西:
//document/itemlist/item/accessories/price : 158.54
procedure TForm1.Button1Click(Sender: TObject);
var
S, ss: string;
LNode: IDOMNode;
Index: Integer;
XMLPath:string;
XMLDoc: IXMLDocument;
XMLSelect:IDomNodeSelect;
MainNode, Data, Node: IXMLNode;
procedure AddNodeValToMemo(NodeEl: IXMLNode);
var
j: Integer;
TempNode: IXMLNode;
S, ss: string;
begin
for j := 0 to NodeEl.ChildNodes.Count - 1 do
begin
TempNode := NodeEl.ChildNodes[j];
if TempNode.IsTextElement then
begin
ss := TempNode.ParentNode.NodeName+'/'+TempNode.NodeName;
S := TempNode.nodeValue;
Memo1.Lines.Add(ss + ': ' + S);
inc(Index);
Label1.Caption:=IntToStr(Index);
end;
if TempNode.HasChildNodes then
AddNodeValToMemo(TempNode);
end;
end;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.LoadFromFile(DIR + XMLFILE);
XMLDoc.Active := True;
XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent,doAutoPrefix];
XMLDoc.Version := '1.0';
Index:=0;
MainNode := XMLDoc.documentElement;
AddNodeValToMemo(MainNode);
// Form1.DomToTree(MainNode,nil);
// TreeView1.FullExpand;
XMLDoc.Active := False;
end;
【问题讨论】:
因为你是做递归的人,你只需要记住当前节点的路径。 【参考方案1】:只需跟踪要添加的节点的当前路径,并将其传递给每个子节点的下一次迭代,例如:
procedure TForm1.Button1Click(Sender: TObject);
var
S, ss: string;
LNode: IDOMNode;
Index: Integer;
XMLPath: string;
XMLDoc: IXMLDocument;
XMLSelect:IDomNodeSelect;
MainNode, Data, Node: IXMLNode;
procedure AddNodeValToMemo(const Path: string; NodeEl: IXMLNode);
var
j: Integer;
TempNode: IXMLNode;
S, ss:, nodePath string;
begin
nodePath := Path+'/'+NodeEl.NodeName;
for j := 0 to NodeEl.ChildNodes.Count - 1 do
begin
TempNode := NodeEl.ChildNodes[j];
if TempNode.IsTextElement then
begin
ss := nodePath+'/'+TempNode.NodeName;
S := TempNode.NodeValue;
Memo1.Lines.Add(ss + ': ' + S);
inc(Index);
Label1.Caption := IntToStr(Index);
end;
if TempNode.HasChildNodes then
AddNodeValToMemo(nodePath, TempNode);
end;
end;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.LoadFromFile(DIR + XMLFILE);
XMLDoc.Active := True;
XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent,doAutoPrefix];
XMLDoc.Version := '1.0';
Index := 0;
MainNode := XMLDoc.documentElement;
AddNodeValToMemo('/', MainNode);
// Form1.DomToTree(MainNode,nil);
// TreeView1.FullExpand;
XMLDoc.Active := False;
end;
【讨论】:
以上是关于如何在 Delphi 中获取实际 IXMLNode 的完整路径?的主要内容,如果未能解决你的问题,请参考以下文章