我现在要做的事是在TreeView里面选中一个节点进行新建,这个是成功的,但是要同时XML文件里的对应的那个节点下也新建一个节点,貌似没有成功啊,每次都是在XML的根节点下新建了一个节点,经过调试后我发现树的所选节点没有传递到我定义的FindNodePath函数里面去,后面的当然也没法有数据了,先附一下我的代码吧,不长,但看着可能有点费力,但问题应该不是在我的函数里面//==============================================================================
// 新建节点
//==============================================================================
procedure TForm1.newBtnClick(Sender: TObject);
var
  rNode,tmpNode,newNode: IXMLNode;
  nowTreeNode: TTreeNode ;
  nowNodePath: TStringList;
  cNode,pNode,nNode:TTreeNode ;
  i:Integer;
  xmlToTree:TXmlToTree;
  newname:string;
  flag : Boolean;
begin
   newname := InputBox('提示','请输入文件名:','newname');
  flag := True ;
  if TreeView1.Selected.HasChildren  then
  begin
    cNode := TreeView1.Selected.getFirstChild;
    for i:=1 to TreeView1.Selected.Count-1 do
    begin
      cNode := cNode.getNextSibling;
      if cNode.Text = newname then
      begin
      ShowMessage('已经有一个此名字的文件!');
      flag := False ;
      Break;
      end;
    end;
  end;
  if flag  then
      TreeView1.Items.AddChild(TreeView1.Selected , newname);  xmlToTree:= TXmlToTree.Create ;
  nowTreeNode:= TreeView1.Selected;//此句执行后nowTreeNode为什么是空的?  nowNodePath := xmlToTree.findNodePath(nowTreeNode);
  rNode := XMLDocument1.DocumentElement;
  tmpNode :=  xmlToTree.findNode(nowNodePath,rNode);
  newNode := tmpNode.AddChild('DIR');
  newNode.Attributes['Label'] := newname;  XMLDocument1.SaveToFile('e:\xiaowei\mytest.xml');
end;

解决方案 »

  1.   

    我把我那两个函数的代码也附上来吧,望大家帮帮忙啊
    //这个函数是利用树中选定节点路径来寻找XML中的节点
    function TXmlToTree.findNode(nodePath:TStringList;rNode:IXMLNode): IXMLNode;
    var
      i,j:Integer;
    begin
      for I := nodePath.Count-1 downto 0 do
      begin
      if rNode.HasChildNodes then
      begin
        for j := 0 to rNode.ChildNodes.Count-1 do
          begin
            if ((rNode.ChildNodes[j].Attributes['Label'] = nodePath[i]) and
            (rNode.ChildNodes[j].HasChildNodes) and (i <> 0)) then
              rNode := rNode.ChildNodes[j];
          end;
      end;
      end;
      Result := rNode;
    end;//这个函数是通过点击树节点获取所选节点的路径
    function TXmlToTree.findNodePath(nowTreeNode: TTreeNode): TStringList;
      var
      i:Integer;
      nowNodePath: TStringList;
    begin
      nowNodePath := TStringList.Create ;
      nowNodePath.Add(nowTreeNode.Text) ;
      for i := 0 to nowTreeNode.Index do
      begin
        nowNodePath.Add(nowTreeNode.Text);
        if i<>nowTreeNode.Index then
          nowTreeNode := nowTreeNode.Parent;
      end;
      Result := nowNodePath;
    end;