本来XML 文件中的内容为下面:
<?xml version="1.0" encoding="GB2312" ?> 
 <基础信息>
 <商品信息>
  <商品编号>00001</商品编号> 
  <商品名称>成品</商品名称> 
  <助记码>CP</助记码> 
  <基本单位>5</基本单位> 
  <条码>123456</条码> 
  <预售价>0</预售价> 
  <最近进价>0</最近进价> 
  </商品信息>
 <往来单位>
  <单位编码>C001</单位编码> 
  <单位名称>一级单位</单位名称> 
  <助记码>YJDW</助记码> 
  <往来类别>两者皆是</往来类别> 
  </往来单位>
  </基础信息>
但是为了 传送方便,别人直接 把XML中内容用 String类型作为参数传过来;我读取这些字符并且 把这些字符转换成XML好方便读取里面的记录;
Function TWsGetSysMsg.UpLoadData(FileString:String):String;stdCall;
FileString 参数里面的类容就为上面(<?xml version="1.0" encoding="GB2312"?>
 <基础信息><商品信息><商品编号>00001</商品编号> <商品名称>成品</商品名称> <助记码>CP</助记码> <基本单位>5<基本单位> <条码>123456</条码> <预售价>0</预售价> <最近进价>0</最近进价> </商品信息><往来单位><单位编码>C001</单位编码> <单位名称>一级单位</单位名称> <助记码>YJDW</助记码> <往来类别>两者皆是</往来类别> </往来单位></基础信息>

var
    BaseData:TXMLDocument;
    Root,Parent_Node,Child_Node :IXmlNode;
begin
    try
        BaseData:=TXMLDocument.Create(nil);
        BaseData.FileName:=FIleName;
        BaseData.Active:=True;
        Root:=BaseData.DocumentElement;//在这里报地址错误
        Parent_Node := Root.ChildNodes.First;;//加载文件会在这里报NO ACTIVE Document
        while (Parent_Node<>nil) do //循环取多个商品信息
        begin
           if (Parent_Node.NodeName = '商品信息') then //判断是否为商品信息
           begin
                StringList.Add('//////商品信息///////');
                Child_Node := Parent_Node.ChildNodes.First;
                while (Child_Node<>nil) do //循环取商品信息的各个子各点
                begin
                    if (Child_Node.NodeName = '商品编码') then //判断是否为商品编码结点
                    StringList.Add('商品编码:'+Child_Node.Text) //取商品编码结点的值,取于name字段中
                    else if (Child_Node.NodeName = '商品名称') then
                    StringList.Add('商品名称:'+Child_Node.Text)
                    else if (Child_Node.NodeName = '助记码') then
                    StringList.Add('助记码:'+Child_Node.Text);
                    Child_Node := Child_Node.NextSibling; //顺序取下一个商品信息的子结点信息
                end;
           end
           else                                                                
           if (Parent_Node.NodeName = '往来单位') then //判断是否为往来单位
           begin
                StringList.Add('//////往来单位///////');
                Child_Node := Parent_Node.ChildNodes.First;
                while (Child_Node<>nil) do //循环取往来单位的各个子各点
                begin
                    if (Child_Node.NodeName = '单位编码') then //判断是否为商品编码结点
                    StringList.Add('单位编码:'+Child_Node.Text)
                    else if (Child_Node.NodeName = '单位名称') then
                    StringList.Add('单位名称:'+Child_Node.Text)
                    else if (Child_Node.NodeName = '助记码') then
                    StringList.Add('助记码:'+Child_Node.Text);
                    Child_Node := Child_Node.NextSibling; //顺序取下一个往来单位的子结点信息
                end;
           end;
           Parent_Node := Parent_Node.NextSibling; //顺序取下一个基础信息的子节点
        end;
    finally
        BaseData.Free;
        StringList.Free;
    end;
    Result:=StringList.Text;
end;上面问题如何解决,或者那位大虾给个 列子。读取字符内容(其类容为XML 格式),将字符类容转换成XML,能读取XML 记录

解决方案 »

  1.   

    BaseData:=TXMLDocument.Create(nil);
    改为
    BaseData:=TXMLDocument.Create(Application);
      

  2.   

    用NativeXml很简单几句代码就行了!很方便
      

  3.   

    楼上二憨正解,这是在有FORM 窗体的下将BaseData:=TXMLDocument.Create(nil);
    改为
    BaseData:=TXMLDocument.Create(Application) 和 BaseData:=TXMLDocument.Create(self) 都可以解决。
    但是 我是在没有FORM 窗体中,只有unit单元写的,就只能写成BaseData:=TXMLDocument.Create(nil) 这样,其他两种 都不能编译通过。提示错误
    [Error] WsGetSysMsgImpl.pas(409): There is no overloaded version of 'Create' that can be called with these arguments
      

  4.   


    无form的情况下用IXMLDocument声明,如下所示:procedure TForm1.Button1Click(Sender: TObject);
    var
            mxml: IXMLDocument;
            Root,Parent_Node,Child_Node :IXmlNode;
    begin
            mxml := TXMLDocument.Create(nil);
            mxml.FileName := 'd:\test.xml';
            mxml.Active := True;
            Root:=mxml.DocumentElement;
            Parent_Node := Root.ChildNodes.First;
            showmessage(Parent_Node.NodeName);
            mxml._Release;
    end;
      

  5.   


    非常感谢,按照以下代码修改成功了procedure TForm1.Button1Click(Sender: TObject);
    var
            mxml: IXMLDocument;
            Root,Parent_Node,Child_Node :IXmlNode;
    begin
            mxml := TXMLDocument.Create(nil);
            mxml.FileName := 'd:\test.xml';
            mxml.Active := True;
            Root:=mxml.DocumentElement;
            Parent_Node := Root.ChildNodes.First;
            showmessage(Parent_Node.NodeName);
            mxml._Release;
    end;