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