现在在做个项目,需要和C++端通信,C++端发送http+XML形式的报文(即构造http报文,报文正文为xml形式),CDATA里包含的是二进制的文件,我使用SOCEKT接收报文,但不知道如何处理才能接收二进制文件并保存到文件中,请知道的大虾给指点指点,最好有点源码.
    接收的XML形式如下:
    <根接点>
      <length>文件长度</length>
      ![CDATA[二进制文件]]
    </跟接点>

解决方案 »

  1.   

    好像就是直接放的吧?
    或者base64后放?
      

  2.   

    C++那边好像是直接读的二进制流放到XML中的,没进行什么特殊的处理,但我这边接收了后不知道怎么处理了
      

  3.   

    这是之前项目的一部分代码,希望对楼主有帮助:
    interfaceuses
      SysUtils,ActiveX,msxml;type
      RecUser=Record
        U_Id       :widestring;
        U_Name     :widestring;
        U_Sex      :widestring;
        U_Birth    :widestring;
        U_Tel      :widestring;
        U_Addr     :widestring;
        U_PostCode :widestring;
        U_Email    :widestring;
      end;type
      TXMLOption=class
      private
        FActive  :boolean;
        FFilename: string;
        FXMLDoc  :IXMLDOMDocument;
        //填加一个子节点
        procedure AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
      public
        procedure CreateBlank(Filename: string);
        procedure OpenXml(Filename: string);
        procedure CloseXml;
        procedure AppendUser(muser:RecUser);
        procedure InsertUser(uid:string;muser:RecUser);
        procedure RemoveUser(uid:string);
        procedure ReplaceUser(uid:string;newuser:RecUser);
        function  FindUser(userid:widestring):boolean;
        function  GetNodeLength(node:widestring):integer;
      end;implementationconst
      XMLTag          = 'xml';
      XMLPrologAttrs  = 'version="1.0" encoding="UTF-8"';
      XMLComment      = '主站规约库';  UserWatcherTag = 'user-watcher';
      XMLComment2    = '创建文档时间:';
      UsersTag       = 'users';
      U_Id           = 'id';
      U_Name         = 'name';
      U_Sex          = 'sex';
      U_Birth        = 'birth';
      U_Tel          = 'tel';
      U_Addr         = 'addr';
      U_PostCode     = 'postcode';
      U_Email        = 'email';//创建一个空XML,如果这个Filename文件已经存在,则覆盖
    procedure TXMLOption.CreateBlank(Filename: string);
    begin
      FActive:=false;
      FFilename:='';
      try
        FXMLDoc := CoDOMDocument.Create;
        FXMLDoc.AppendChild(FXMLDoc.CreateProcessingInstruction(XMLTag, XMLPrologAttrs)); //表头
        //FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment));                           //文档说明
        FXMLDoc.AppendChild(FXMLDoc.CreateElement(UserWatcherTag));                       //元素
        //FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment2+datetimetostr(now)));       //文档结尾
        FXMLDoc.save(Filename);
        FFilename:=Filename;
        FActive:=true;
      except
        FXMLDoc:=nil;
      end;
    end;
    //打开一个存在的Filename XML文档
    procedure TXMLOption.OpenXml(Filename: string);
    begin
      if not Assigned(FXMLDoc) then
      begin
        FXMLDoc := CoDOMDocument.Create;
        if FXMLDoc.Load(Filename) then FActive:=true
        else FActive:=false;
        if FActive then FFilename:=Filename
        else FFilename:='';
      end;
    end;
    //关闭一个打开的XML文档
    procedure TXMLOption.CloseXml;
    begin
      if Assigned(FXMLDoc) then FXMLDoc:=nil;
      FFilename:='';
      FActive:=false;
    end;
    procedure TXMLOption.AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
    var
      Internal: IXMLDOMElement;
    begin
      Internal:=IXMLDOMElement(Parent.AppendChild(FXMLDoc.CreateElement(Field)));
      Internal.AppendChild(FXMLDoc.CreateTextNode(Value));
    end;
    //填加一个节点到后面
    procedure TXMLOption.AppendUser(muser:RecUser);
    var
      xuser:IXMLDOMElement;
      xroot:IXMLDOMElement;
    begin
      if FActive then
      begin
        xroot:=FXMLDoc.documentElement;
        xuser :=IXMLDOMElement(xroot.AppendChild(FXMLDoc.CreateElement(UsersTag)));
        xuser.setAttribute('codeNo', '323');
        AddSimpleElement(xuser,U_Id,muser.U_Id);
        AddSimpleElement(xuser,U_Name,muser.U_Name);
        AddSimpleElement(xuser,U_Sex,muser.U_Sex);
        AddSimpleElement(xuser,U_Birth,muser.U_Birth);
        AddSimpleElement(xuser,U_Tel,muser.U_Tel);
        AddSimpleElement(xuser,U_Addr,muser.U_Addr);
        AddSimpleElement(xuser,U_PostCode,muser.U_PostCode);
        AddSimpleElement(xuser,U_Email,muser.U_Email);
        FXMLDoc.save(FFilename);
      end;
    end;
    procedure TXMLOption.InsertUser(uid:string;muser:RecUser);
    var
      xfind:IXMLDOMNode;
      xuser:IXMLDOMElement;
      xroot:IXMLDOMElement;
      xpath:string;
    begin
      if not FActive then exit;
      xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
      xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
      //如果没有找到, xfind=nil 则在文件的末尾插入
      //如果找到,xfind<>nil 则在找到的纪录前面插入
      xroot:=FXMLDoc.documentElement;
      xuser :=IXMLDOMElement(xroot.insertBefore(FXMLDoc.CreateElement(UsersTag),xfind));
      AddSimpleElement(xuser,U_Id,muser.U_Id);
      AddSimpleElement(xuser,U_Name,muser.U_Name);
      AddSimpleElement(xuser,U_Sex,muser.U_Sex);
      AddSimpleElement(xuser,U_Birth,muser.U_Birth);
      AddSimpleElement(xuser,U_Tel,muser.U_Tel);
      AddSimpleElement(xuser,U_Addr,muser.U_Addr);
      AddSimpleElement(xuser,U_PostCode,muser.U_PostCode);
      AddSimpleElement(xuser,U_Email,muser.U_Email);
      FXMLDoc.save(FFilename);
    end;
    procedure TXMLOption.RemoveUser(uid:string);
    var
      xfind:IXMLDOMNode;
      xroot:IXMLDOMElement;
      xpath:string;
    begin
      if not FActive then exit;
      xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
      xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
      if xfind<>nil then
      begin
        xroot:=FXMLDoc.documentElement;
        xroot.removeChild(xfind);
        FXMLDoc.save(FFilename);
      end;
    end;
    procedure TXMLOption.ReplaceUser(uid:string;newuser:RecUser);
    var
      xfind,newnode:IXMLDOMNode;
      xroot:IXMLDOMElement;
      xpath:string;
    begin
      if not FActive then exit;
      xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
      xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
      //如果没有找到,则不做替换
      if xfind<>nil then
      begin
        newnode:=xfind.cloneNode(true);
        newnode.selectSingleNode(U_Id).text:=newuser.U_Id;
        newnode.selectSingleNode(U_Name).text:=newuser.U_Name;
        newnode.selectSingleNode(U_Sex).text:=newuser.U_Sex;
        newnode.selectSingleNode(U_Birth).text:=newuser.U_Birth;
        newnode.selectSingleNode(U_Tel).text:=newuser.U_Tel;
        newnode.selectSingleNode(U_Addr).text:=newuser.U_Addr;
        newnode.selectSingleNode(U_PostCode).text:=newuser.U_PostCode;
        newnode.selectSingleNode(U_Email).text:=newuser.U_Email;
        xroot:=FXMLDoc.documentElement;
        xroot.replaceChild(newnode,xfind);
        FXMLDoc.save(FFilename);
      end;
    end;
      

  4.   

    定义一个xml:IXmlDocument;
    xml := TXmlDocument.Cteate;
    xml.LoadfromXML('xml字符串');
    这样就可以解析了
      

  5.   

    ok1411说的我知道,我现在迷惑的就是在xml加载了报文后怎么解析出其中的cdata部分,那部分是二进制文件,不知道怎么还原成文件