马上要进行一个系统的开发,计划后台服务器用VC++实现,前台用Delphi。中间用自己做的通讯服务器进行通讯----使用TCP/IP.通讯包数据为XML格式。
请问,我该怎么在前端在解包后取得XML中的数据(可能我还需要把从XML中取得的数据进行类包装),Delphi是否有现成的控件可用?TXMLDocument?该怎么用呢?
(或许小弟的问题很幼稚吧,呵,没有办法,没有弄过这个东西)

解决方案 »

  1.   

    以前用这样的方式开发过。
    我们自己做的控件,文件格式按xml的格式,不过解析文本是用自己写的代码。TXMLDocument可以用,不过在delphi6下写文件会有问题,解决不了后没用它,delphi7下应该可以很好的使用的。解析xml文件中的内容。
    //以下将一个xml文件中的信息写入一个二维数组中
    procedure GetXml(getStrLst: TStringList);
    var
      Common_Node: IXMLNode;
      commonchild_Node: IXMLNode;
      record_Node: IXMLNode;
      recordchild_Node: IXMLNode;
      field_Node: IXMLNode;
      I,J : Integer;
      XMLDocument1: TXMLDocument;
    begin
      //******* XMLDocument1:=TXMLDocument.Create(nil)²»ÄÜ´´½¨¶ÔÏó**********//
      // ÔÚINTERFACE²¿·Ö¼ÓÈëFORMSµ¥Ôª£¬È»ºóÔÚCREATEº¯ÊýÖмÓÈëAPPLICATION½á¹û¿ÉÒÔÁË//
      XMLDocument1:=TXMLDocument.Create(Application);
      XMLDocument1.FileName:='tmpPrint.xml';
      XMLDocument1.Active:=True;
      try
       Common_Node := XMLDocument1.DocumentElement.ChildNodes[0];
       commonchild_Node:= common_Node.ChildNodes.first;
      except
      on E:Exception do
        ShowMessage(E.Message);
      end;
      //###############################
      while (commonchild_Node<> nil) do
      begin
        getStrLst.Values[commonchild_Node.NodeName]:= commonchild_Node.NodeValue;
        commonchild_Node:= commonchild_Node.NextSibling;
      end;
      //#######################################################
      record_Node:= XMLDocument1.DocumentElement.ChildNodes[1];
      recordchild_Node:= record_Node.ChildNodes.First;
      //&frac14;&Oacute;&Ograve;&raquo;&Ecirc;&Ccedil;&Icirc;&ordf;&Aacute;&Euml;&frac12;&laquo;×&Ouml;&para;&Icirc;&Atilde;&ucirc;·&Aring;&Ocirc;&Uacute;&micro;&Uacute;&Ograve;&raquo;&ETH;&ETH;
      setlength(GetArray,record_Node.ChildNodes.Count+1,recordchild_Node.ChildNodes.Count);
      //#############################################&ETH;&acute;&Egrave;&euml;×&Ouml;&para;&Icirc;&Atilde;&ucirc;&micro;&frac12;&Ecirc;&yacute;×é&micro;&Uacute;&Ograve;&raquo;&ETH;&ETH;
      field_Node:= recordchild_Node.ChildNodes.First;
      for J:=0 to high(getArray[0]) do begin
        if field_Node<>nil then
          getArray[0,J]:=field_Node.NodeName;
        field_Node:=field_Node.NextSibling;
      end;
      //#################################&ETH;&acute;&Egrave;&euml;&Ouml;&micro;&micro;&frac12;&AElig;&auml;&Euml;&ucirc;&ETH;&ETH;
      for I:=1 to high(getArray) do begin
        if recordchild_Node<>nil then begin
          field_Node:= recordchild_Node.ChildNodes.First;
          for J:=0 to high(getArray[0]) do begin
            if field_Node<>nil then begin
              if field_Node.NodeValue<>Null then
                getArray[I,J]:=field_Node.NodeValue
              else
                getArray[I,J]:='';
            end;
            //##################################
            if field_Node.NextSibling<> nil then
              field_Node:=field_Node.NextSibling;
          end;{n,for}
        end;{n,if}
        //if recordchild_Node.NextSibling<>nil then &frac14;&Oacute;&Egrave;&euml;&Aring;&ETH;±&eth;&raquo;á&Oacute;°&Iuml;ì&ETH;§&Acirc;&Ecirc;
        //&sup2;&raquo;&frac14;&Oacute;&Ograve;&sup2;&iquest;&Eacute;&Auml;&Uuml;&Atilde;&raquo;&Oacute;&ETH;&Icirc;&Ecirc;&Igrave;&acirc;&pound;&not;&Atilde;&raquo;&Oacute;&ETH;×&ETH;&Iuml;&cedil;&sup2;&acirc;&Ecirc;&Ocirc;&sup1;&yacute;
        recordchild_Node:=recordchild_Node.NextSibling;
      end;{n,for}
      XMLDocument1.Free;
    end;不知道为什么有乱码!~~
      

  2.   

    在前端界面,我可能会把xml中取出的数据进行一次封装,因为我现在拥有的控件(公司自己写的)是基于一套完整的类结构的,而没有基于xml文件的,你认为,有必要自己写一套基于xml的控件吗?还是就用现在的控件就行了。xml的处理速度如何?