要求用最快速的方法生成

解决方案 »

  1.   

    Const
      CompartStr: String='  ';
    var
      CurrentNode : TTreeNode;
      Q_Temp,Q_TempWorker :  TADOQuery;
      NodeText ,DepID,CompartChar ,char ,Num: String;
      I,J : Integer;
    begin
        for J:=0 to Node.Count-1 do
        begin
          CurrentNode:=Node[J];
          NodeText := CurrentNode.Text;
          DepID:=Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
          NodeText:=Copy(NodeText,1,Pos('[',NodeText)-1);
          char:='';
          for I:=0 to Node.Level-1 do
          begin
            char := char + CompartStr;
          end;
          CompartChar:=Char;
          //写入文件
          if CurrentNode.HasChildren then
          begin
            XmlStr.Add(CompartChar+'    <Dep>');
            XmlStr.Add(CompartChar+'      <DepName>'+NodeText+'</DepName>');
          end
          else
          begin
            Q_Temp:= TADOQuery.Create(Application);
            Q_Temp.Connection:=frm_START.ADOCON_LOADVer;
            Q_Temp.SQL.Text:='SELECT Count(*) AS Num FROM WorkerToWork WHERE Dep01=:Dep01';
            Q_Temp.Parameters.ParamByName('Dep01').Value:= DepID;
            Q_Temp.Open;
            Num:= Q_Temp.FieldByName('Num').AsString;
            XmlStr.Add(CompartChar+'    <Dep>');
            XmlStr.Add(CompartChar+'      <DepName>'+NodeText+'('+Num+')</DepName>');
          end;
          if CurrentNode.HasChildren then
          begin
            AddXmlStrings(CurrentNode);
          end
          else
          begin
            Q_TempWorker:= TADOQuery.Create(Application);
            Q_TempWorker.Connection:=frm_START.ADOCON_LOADVer;
            Q_TempWorker.SQL.Text:= 'SELECT Worker.Worker01 AS WorkerID ,Worker.Worker03 AS WorkerName FROM Worker JOIN WorkerToWork ON Worker.Worker01=WorkerToWork.Worker01 WHERE WorkerToWork.Dep01=:Dep01 ORDER BY Worker.Worker01';
            Q_TempWorker.Parameters.ParamByName('Dep01').Value:= DepID;
            Q_TempWorker.Open;
            while not Q_TempWorker.Eof do
            begin
              XmlStr.Add(CompartChar+'        <Worker>');
              XmlStr.Add(CompartChar+'          <WorkerName>'+Q_TempWorker.FieldByName('WorkerName').AsString+'</WorkerName>');
              XmlStr.Add(CompartChar+'          <WorkerID>'+Q_TempWorker.FieldByName('WorkerID').AsString+'</WorkerID>');
              XmlStr.Add(CompartChar+'        </Worker>');
              Q_TempWorker.Next;
            end;
            Q_TempWorker.Free;
          end;
          XmlStr.Add(CompartChar+'    </Dep>');
        end;
    我没有更好的办法,只有自己来处理写。
      

  2.   

    procedure Tfrm_OrganizeM.AddXmlStrings(Node: TTreeNode);方法中使用了递归。
      

  3.   

    上面的方法在下面的方法中调用:
    procedure Tfrm_OrganizeM.W1Click(Sender: TObject);
    var
      NodeText: String;
    begin
      XmlStr:=TStringList.Create;
      with tvOrganize do
      begin
        NodeText := Items[0].Text;  
        NodeText:=Copy(NodeText,1,Pos('[',NodeText)-1);
      end;
      //写入文件
      XmlStr.Add('<?xml version="1.0" encoding="gb2312" ?> ');
      XmlStr.Add('<?xml-stylesheet type=''text/xsl'' href=''Worker.xsl''?>');
      XmlStr.Add('<Text>');
      XmlStr.Add('  <TextName>公司花名册</TextName>');
      XmlStr.Add('  <Dep>');
      XmlStr.Add('    <DepName>'+NodeText+'</DepName>');
      AddXmlStrings(tvOrganize.Items[0]);
      XmlStr.Add('  </Dep>');
      XmlStr.Add('</Text>');
      XmlStr.SaveToFile('花名册.xml');
      ShellExecute(0, 'open', PChar('花名册.xml'), nil, nil, SW_SHOW) ;
      XmlStr.Free;
      {Xml格式:
      <Dep>
        <DepName> DepName </DepName>
        //----------------------------
        <Dep>
          <DepName> DepName </DepName>
          ...
          <Worker>
            <WorkerName> WorkerName </WorkerName>
            <WorkerID> WorkerID </WorkerID>
          </Worker>
        </Dep>
        //----------------------------
        <Worker>
          <WorkerName> WorkerName </WorkerName>
          <WorkerID> WorkerID </WorkerID>
        </Worker>
      </Dep>
      }
    end;
      

  4.   

    要看你要生成的XML格式如何,以及需要把哪些属性反映到XML中去。下面是一种方式,你可以自行扩充:const IndentStr = '  '; // XML节点之间的缩进function TreeNodeToXml(Node: TTreeNode; Indent: String): String;
    var
      ChildNode: TTreeNode;
    begin
      if not Assigned(Node) then Exit;
      Result := Indent + '<Child Name"'+ Node.Text '" ImageIndex="' + IntToStr(Node.ImageIndex) + '">'#13#10;
      ChildNode := Node.GetFirstChild;
      while Assigned(ChildNode) do begin
        Result := Result + TreeNodeToXml(ChildNode, Indent + IndentStr);
        ChildNode := ChildNode.GetNextSibling;
      end;
      Result := Result + Indent + '</Child>'#13#10; 
    end;调用时这样写:
      var xmlStr: String;
    begin
      xmlStr := TreeNodeToXml(TreeView1.Items.GetFirstNode, '');
      ShowMessage(xmlStr);
    end;
      

  5.   

    都没有用AddChild、setAttribute这些属性写XML文件吗?
      

  6.   

    我是要把Treeview节点值写入XML文件的属性中
      

  7.   

    我查了VCL,好像没有。如果用数据集倒是有存储到XML的方法。
      

  8.   

    Procedure Tform1.treetoDom(TreeNode:TTreeNode;xmlnode:ixmlnode);
    var
      i,j:Integer;
      s,strDir:string;
      MDoc:TXMLDocument;
      aNode:IXMLNode;
    begin
           strDir := GetCurrentDir;
           MDoc:=TXMLDocument.Create(self);
           MDoc.XML.Clear;
           MDoc.Active := true; //激活XMLDoc,自动初始化空的XML文档
           MDoc.Version := '1.0';
           MDoc.Encoding := 'GB2312'; //设置字符集    //加入根结点
        //TreeNode.HasChildren
        if TreeNode.Parent=nil then
           begin
              aNode:=MDoc.AddChild('DSTreeRoot');
              aNode.setAttribute('text', TreeNode.Text);
              aNode.SetAttribute('open', 'Ture');
              aNode.SetAttribute('href','http://');
              aNode.SetAttribute('target','box');
              aNode.SetAttribute('treeId','16');
              treetoDom(TreeNode.GetNext,aNode,sum);
           end
        else
           begin
              For j:=0 TO TreeNode.Count-1 Do
                 for i:=0 to TreeNode.Level-1 do
                       begin
                       //加入子结点
                          aNode:=xmlnode.AddChild('DSTree');
                       //设置接点属性
                          aNode.SetAttribute('text', TreeNode.Text);
                          aNode.SetAttribute('open', 'False');
                          aNode.SetAttribute('href','http://');
                          aNode.SetAttribute('target','box');
                          aNode.SetAttribute('treeId','16');
                          treetoDom(TreeNode.GetNext,aNode,sum);
                       end;
           end;    MDoc.SaveToFile(strDir+'\Tree.xml'); //把组织好的XML文档存于Tree.xml文件中
        MDoc.Active := False; //钝化(关闭)XMLDoc
    end;
    只能取Treeview的前面几位到XML文件中,而且XML文件中的text有重复,在Treeview中TreeNode.Text的值是没有重复的?请问是怎样解决?