动态创建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 

 

 

转载于:https://www.cnblogs.com/cardon/archive/2010/03/07/1680190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值