TXMLDocument的保存问题,可能是该控件的Bug,高手请进

zzn007 2008-01-14 03:38:11
最近使用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的内容是正确的
...全文
112 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlestone08 2009-08-10
  • 打赏
  • 举报
回复
虽然你已经结了,我还是回一个吧。
我不认为这是个BUG,而是你对这个属性理解有误.
我个人感觉Doc.XML并不是实时反应XML文档内容的,它只是与载入的XML文件同步,变化并不能在XML中体现,
在应用中,不应该属用这个属性,如果非要这样的话,就只能存盘以求得与内容同步后,再使用,这个时候就应该是正确的了.

只有在LOAD和SAVE时它有些动作,其它的时候并没有什么意义
zzn007 2008-03-25
  • 打赏
  • 举报
回复
看来只能这样了,结贴吧
zzn007 2008-02-14
  • 打赏
  • 举报
回复
请高人指点一下为什么会出现此问题呢?
zhouchunyu 2008-01-16
  • 打赏
  • 举报
回复
帮顶
jerry8 2008-01-16
  • 打赏
  • 举报
回复
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"/>
zzn007 2008-01-16
  • 打赏
  • 举报
回复
我在程序里面已经有注释了,请大家看清楚:
第一次和第二次属性值都是'111',也就是连续两次输入相同的属性值,都保存;第三次输入不同的属性值,这时Doc.XML.Text的数值就是第二次的数值,而不是第三次的数值。楼上的三次都输入不同的属性值,这个是没问题的!
jerry8 2008-01-15
  • 打赏
  • 举报
回复
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,后取他的值
和你代码稍有不同
zzn007 2008-01-15
  • 打赏
  • 举报
回复
你们还是没看懂我要的东西,我要的是这个属性Doc.XML.Text,要求他我不管怎么操作,它的值我都要当前最新的。不是要求保存不同的内容!
因为别人使用的时候是不知道是否保存了那个数值的
jerry8 2008-01-15
  • 打赏
  • 举报
回复
网虫先生的方法可以的

楼主要细看下,简单运行下。。
zzn007 2008-01-15
  • 打赏
  • 举报
回复
自己顶一下,请问这个问题没人解决一下?
zzn007 2008-01-14
  • 打赏
  • 举报
回复
楼上的,服了你了!那样写我也知道没事的,但是必须我那样写!因为别人在使用这个属性,而且已经使用了,他可不知道这个属性是否已经写过数值了!这个不是我要的答案
pengxuan 2008-01-14
  • 打赏
  • 举报
回复
这样写就没事了
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;
zzn007 2008-01-14
  • 打赏
  • 举报
回复
我现在想到的办法就是,在设置属性之前判断一下原值与新值是否相同,如果相同则不进行设置。但是我的程序使用了XML Data Binding,属性设置代码有上千行,这样的话我要吐血啦!
高手们,看看有没有什么属性可以设置的?按照现在的程序,还必须使用XMLDocument.XML.Text属性

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧