动态创建TXMLDocument时出现Access violation
动态创建TXMLDocument时出现Access violation
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