最近使用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的内容是正确的
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的内容是正确的
解决方案 »
- 再请教一个问题,如果修改一个十六进制文件?
- 关于窗体StayOnTop的问题
- 定时读取数据的程序,取不到最新的数据??
- 急急:怎样Copy一个Grid控件到一个新创建的Grid控件? (连同Grid的列属性定义Copy)
- 请大家讨论一下在fastreport里面怎样控制显示出来的浮点数的小数点位数(不是在delphi里面控制)
- 怎样能使QRDBText中的内容超过一定的字符就自动换行显示?
- 图形入库或文件入库的问题???
- delphi里面如何操作execel表?
- 关于flash]
- 简单的问题,给分。
- Delphi7检测到错误类 EAccessViolation,错误信息:'Access violation at address 0047D5C7 in module
- 如何得到其他程序的Richedit中的RTF数据?
高手们,看看有没有什么属性可以设置的?按照现在的程序,还必须使用XMLDocument.XML.Text属性
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;
因为别人使用的时候是不知道是否保存了那个数值的
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,后取他的值
和你代码稍有不同
第一次和第二次属性值都是'111',也就是连续两次输入相同的属性值,都保存;第三次输入不同的属性值,这时Doc.XML.Text的数值就是第二次的数值,而不是第三次的数值。楼上的三次都输入不同的属性值,这个是没问题的!
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"/>
我不认为这是个BUG,而是你对这个属性理解有误.
我个人感觉Doc.XML并不是实时反应XML文档内容的,它只是与载入的XML文件同步,变化并不能在XML中体现,
在应用中,不应该属用这个属性,如果非要这样的话,就只能存盘以求得与内容同步后,再使用,这个时候就应该是正确的了.只有在LOAD和SAVE时它有些动作,其它的时候并没有什么意义