最近使用TXMLDocument控件,发现一个重大的Bug,当写入一个节点的相同的属性,两次以上,并且进行保存,然后再设置此属性不同的数值,但是TXMLDocument.xml.text获取的内容,确是上一次的内容。但是savetofile的文件却是正确的,而且node上的xmlText属性也是正确的,就是TXMLDocument.xml.text不正确!请高手解决一下,测试代码如下:procedure TForm1.btn1Click(Sender: TObject);
var
  Doc:txmldocument;
  Root:IXMLNode;
begin
  Doc:=TXMLDocument.Create(self);
  Doc.Active:=True;
  Doc.Encoding:='GB2312';
  Root:=Doc.CreateNode('root');
  Doc.DocumentElement:=Root;  Root.Attributes['aaa']:='111'; //第一次设置属性和数值
  Self.mmo1.Lines.Add(Doc.XML.Text);
  Doc.SaveToFile('d:\1.xml');  Root.Attributes['aaa']:='111'; //再设置一次相同的数值
  Self.mmo2.Lines.Add(Doc.XML.Text);
  Doc.SaveToFile('d:\2.xml');  Root.Attributes['aaa']:='222';
  Self.mmo3.Lines.Add(Doc.XML.Text); //这次就是错误的数值
  Self.mmo1.Lines.Add(Root.XML);//node上的xml是正确的
  Doc.SaveToFile('d:\3.xml');
  Doc.Free;
end;其中,文件1.xml,2.xml,3.xml的内容是正确的

解决方案 »

  1.   

    我现在想到的办法就是,在设置属性之前判断一下原值与新值是否相同,如果相同则不进行设置。但是我的程序使用了XML Data Binding,属性设置代码有上千行,这样的话我要吐血啦!
    高手们,看看有没有什么属性可以设置的?按照现在的程序,还必须使用XMLDocument.XML.Text属性
      

  2.   

    这样写就没事了
    procedure TForm1.Button1Click(Sender: TObject);
    var
        Doc:txmldocument;
        Root:IXMLNode;
    begin
        Doc:=TXMLDocument.Create(self);
        Doc.Active:=True;
        Doc.Encoding:='GB2312';
        Root:=Doc.CreateNode('root');
        Doc.DocumentElement:=Root;    Root.Attributes['aaa']:='111';   //第一次设置属性和数值
        Self.mmo1.Lines.Add(Doc.XML.Text);
        Doc.SaveToFile('d:\1.xml');    Root.Attributes['aaa']:='222';   //再设置一次相同的数值
        Self.mmo2.Lines.Add(Doc.XML.Text);
        Doc.SaveToFile('d:\2.xml');    Root.Attributes['aaa']:='333';
        Doc.SaveToFile('d:\3.xml');
        Self.mmo3.Lines.Add(Doc.XML.Text);   //这次就是错误的数值
        Self.mmo1.Lines.Add(Root.XML);//node上的xml是正确的
        Doc.Free;
    end;
      

  3.   

    你们还是没看懂我要的东西,我要的是这个属性Doc.XML.Text,要求他我不管怎么操作,它的值我都要当前最新的。不是要求保存不同的内容!
    因为别人使用的时候是不知道是否保存了那个数值的
      

  4.   

    procedure   TForm1.Button1Click(Sender:   TObject); 
    var 
            Doc:txmldocument; 
            Root:IXMLNode; 
    begin 
            Doc:=TXMLDocument.Create(self); 
            Doc.Active:=True; 
            Doc.Encoding:='GB2312'; 
            Root:=Doc.CreateNode('root'); 
            Doc.DocumentElement:=Root;         Root.Attributes['aaa']:='111';       //第一次设置属性和数值 
            Self.mmo1.Lines.Add(Doc.XML.Text); 
            Doc.SaveToFile('d:\1.xml');         Root.Attributes['aaa']:='222';       //再设置一次相同的数值 
            Self.mmo2.Lines.Add(Doc.XML.Text); 
            Doc.SaveToFile('d:\2.xml');         Root.Attributes['aaa']:='333'; 
            Doc.SaveToFile('d:\3.xml'); 
            Self.mmo3.Lines.Add(Doc.XML.Text);       //这里显示的是‘333’
              Doc.Free; 
    end;楼上,不是想这样实现嘛 他的代码,最后先保存XMl,后取他的值
    和你代码稍有不同
      

  5.   

    我在程序里面已经有注释了,请大家看清楚:
    第一次和第二次属性值都是'111',也就是连续两次输入相同的属性值,都保存;第三次输入不同的属性值,这时Doc.XML.Text的数值就是第二次的数值,而不是第三次的数值。楼上的三次都输入不同的属性值,这个是没问题的!
      

  6.   

      Doc := TXMLDocument.Create(self);
      Doc.Active := True;
      Doc.Encoding := 'GB2312';
      Root := Doc.CreateNode('root');
      Doc.DocumentElement := Root;  Root.Attributes['aaa'] := '111'; //第一次设置属性和数值
      Self.mmo1.Lines.Add(Doc.XML.Text);
      Doc.SaveToFile('d:\1.xml');  Root.Attributes['aaa'] := '111'; //再设置一次相同的数值
      Self.mmo1.Lines.Add(Doc.XML.Text);
      Doc.SaveToFile('d:\2.xml');  Root.Attributes['aaa'] := '333';
      Doc.SaveToFile('d:\3.xml');
      Self.mmo1.Lines.Add(Doc.XML.Text); //这里显示的是‘333’
      Doc.Free;//我这里MEMO1得内容为
    <?xml version="1.0" encoding="GB2312"?>
    <root aaa="111"/><?xml version="1.0" encoding="GB2312"?>
    <root aaa="111"/><?xml version="1.0" encoding="GB2312"?>
    <root aaa="333"/>
      

  7.   

    虽然你已经结了,我还是回一个吧。
    我不认为这是个BUG,而是你对这个属性理解有误.
    我个人感觉Doc.XML并不是实时反应XML文档内容的,它只是与载入的XML文件同步,变化并不能在XML中体现,
    在应用中,不应该属用这个属性,如果非要这样的话,就只能存盘以求得与内容同步后,再使用,这个时候就应该是正确的了.只有在LOAD和SAVE时它有些动作,其它的时候并没有什么意义