如何在 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 的完整路径?的主要内容,如果未能解决你的问题,请参考以下文章

求教个Delphi上关于操作XML的控件Nativexml的问题

如何在 windows xp 中获取主音量?

delphi如何获取DLL所在的目录

在delphi中如何获取字符串的内存地址

如何获取当前网页的URL? delphi

如何在 Delphi 中获取主板 ID 或序列号?