动态创建TXMLDocument时出现Access violation

动态创建TXMLDocument时出现Access violation

动态创建TXMLDocument对象时(不预先从组件面板拉一个XML组件到在form或其他组件上,纯粹在代码中创建),如果所创建对象未指定其生存周期所依赖的组件时,则在读取该对象属性及属性值时会出现Access violation。
出错代码1
  xmlDoc := TXMLDocument.Create(nil);
  xmlDoc.LoadFromFile(xmlFilePath);
  xmlDoc.Active := true;
  xmlDoc.DocumentElement.ChildNodes['nodeName'].Text := nodeValue;//av here
  
出错代码2
  xmlDoc := TXMLDocument.Create(xmlFilePath);
  xmlDoc.DocumentElement.ChildNodes['nodeName'].Text := nodeValue;//av here

解决方法

为所创建TXMLDocument对象指定其生存周期所依赖的组件。
  xmlDoc := TXMLDocument.Create(self);
  xmlDoc.LoadFromFile(xmlFilePath);
  xmlDoc.Active := true;
  xmlDoc.DocumentElement.ChildNodes['nodeName'].Text := nodeValue;
 1 uses
 2   XMLDoc, XMLIntf;
 3 
 4 { 写入XML内容 }
 5 var
 6   XMLDoc : TXMLDocument;
 7   Node1 : IXMLNode;
 8   Node2 : IXMLNode;
 9 begin
10   XMLDoc := TXMLDocument.Create(nil);
11   try
12     XMLDoc.Active := True;
13     XMLDoc.Version := '1.0';
14     XMLDoc.Encoding := 'GB2312';
15     XMLDoc.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
16 
17     XMLDoc.DocumentElement := XMLDoc.CreateNode('ReportObjectContent');
18     Node1 := XMLDoc.DocumentElement;
19 
20     Node1 := Node1.AddChild('ReportObjectProperty');
21     Node2 := Node1.AddChild('ReportName');
22     Node2.SetAttributeNS('Value''', ReportName);
23     Node2 := Node1.AddChild('ReportType');
24     Node2.SetAttributeNS('Value''', ReportType);
25     Node2 := Node1.AddChild('DataViewName');
26     Node2.SetAttributeNS('Value''', DataViewName);
27     Node2 := Node1.AddChild('SQLStr');
28     Node2.SetAttributeNS('Value''', SQLStr);   
29 
30     XMLDoc.SaveToStream(Stream);
31   finally
32     XMLDoc.Free;
33   end;
34 end;
35 
36 
37 { 读取XML }
38 var
39   XML : TXMLDocument;
40   Node1 : IXMLNode;
41   DocIntf : IXMLDocument;
42 begin
43   XML := TXMLDocument.Create(nil);
44   DocIntf := XML;  //防止接口被自动释放,少了这一句会发生AV
45   try
46     XML.LoadFromStream(Strem);
47     XML.Active := True;
48 
49     { 读ReportObject属性 }
50     Node1 := XML.DocumentElement.ChildNodes.FindNode('ReportObjectProperty');
51     ReportName := Node1.ChildNodes.FindNode('ReportName').GetAttributeNS('Value''');
52     ReportType := Node1.ChildNodes.FindNode('ReportType').GetAttributeNS('Value''');
53     DataViewName := Node1.ChildNodes.FindNode('DataViewName').GetAttributeNS('Value''');
54     SQLStr := Node1.ChildNodes.FindNode('SQLStr').GetAttributeNS('Value''');
55 
56   finally
57     XML := nil;
58     DocIntf := nil;
59   end;
60 end;
61 

 

 

posted on 2010-03-07 15:12  小良cardon  阅读(634)  评论(0编辑  收藏  举报

导航