button1是执行动态创建XmlDocument的例子:
procedure TFrm_E2BTest.Button1Click(Sender: TObject);
var
r1 : IXMLNode;
xml1: TXmlDocument;
begin
xml1:=TXmlDocument.Create(nil);
xml1.LoadFromFile('D:\Pa.xml');
xml1.Active:=True;
r1:=xml1.DocumentElement; //执行这一步时系统报内存访问错误(AV)
Frm_E2BTest.Label1.caption:=r1.NodeName;
XML1 := nil;
end;
------------------------
button2是执行拖放XmlDocument组件的例子
procedure TFrm_E2BTest.Button2Click(Sender: TObject);
var
r2 : IXMLNode;
begin
XMLtest.LoadFromFile('D:\Pa.xml');
XMLtest.Active:=Active;
r2:=XMLtest.DocumentElement; //正常通过
Frm_E2BTest.Label1.caption:=r2.NodeName; //能正确显示根节点名称
end;
----------------------------------------------------------
文件 "Pa.xml"内容是没问题的以上代码用拖放的XmlDocument组件就一切OK,
但自己动态创建XmlDocument组件读取根节点时就报内存错误 。
请问我代码问题出在哪里啊?该怎么修改呢 ?谢谢!
procedure TFrm_E2BTest.Button1Click(Sender: TObject);
var
r1 : IXMLNode;
xml1: TXmlDocument;
begin
xml1:=TXmlDocument.Create(nil);
xml1.LoadFromFile('D:\Pa.xml');
xml1.Active:=True;
r1:=xml1.DocumentElement; //执行这一步时系统报内存访问错误(AV)
Frm_E2BTest.Label1.caption:=r1.NodeName;
XML1 := nil;
end;
------------------------
button2是执行拖放XmlDocument组件的例子
procedure TFrm_E2BTest.Button2Click(Sender: TObject);
var
r2 : IXMLNode;
begin
XMLtest.LoadFromFile('D:\Pa.xml');
XMLtest.Active:=Active;
r2:=XMLtest.DocumentElement; //正常通过
Frm_E2BTest.Label1.caption:=r2.NodeName; //能正确显示根节点名称
end;
----------------------------------------------------------
文件 "Pa.xml"内容是没问题的以上代码用拖放的XmlDocument组件就一切OK,
但自己动态创建XmlDocument组件读取根节点时就报内存错误 。
请问我代码问题出在哪里啊?该怎么修改呢 ?谢谢!
procedure TFrm_E2BTest.Button1Click(Sender: TObject);
var
r1 : IXMLNode;
xml1: IXMLDocument;
begin
xml1:=TXmlDocument.Create(nil);
xml1.LoadFromFile('D:\Pa.xml');
xml1.Active:=True;
r1:=xml1.DocumentElement; //执行这一步时系统报内存访问错误(AV)
Frm_E2BTest.Label1.caption:=r1.NodeName;
XML1 := nil;
end;
var
XMLDocument: IXMLDocument;
xNode, xNode2: IXMLNode;
ss: TStringStream;
begin
Result := '';
ss := TStringStream.Create('');
ss.Position := 0;
ss.Size := 0;
try
XMLDocument := NewXMLDocument;
XMLDocument.Encoding := 'GBK';
XMLDocument.Options := [doNodeAutoIndent];
XMLDocument.NodeIndentStr := ' ';
xNode := XMLDocument.AddChild('Exps'); xNode2 := xNode.AddChild('ExportExpression');
xNode2.Attributes['name'] := '0';
if AExp.Callback then
xNode2.Attributes['callback'] := 'true'
else
xNode2.Attributes['callback'] := 'false';
xNode2 := xNode2.AddChild('exp');
xNode2.Attributes['resType'] := ADataTypeToStr(AExp.ResType);
xNode2.Attributes['expType'] := AExpTypeToStr(AExp.ExpType);
xNode2.Attributes['exptext'] := AExp.FExpText; xNode2 := xNode.AddChild('SaveExpression');
xNode2.Attributes['name'] := '0';
if AExp.Callback then
xNode2.Attributes['callback'] := 'true'
else
xNode2.Attributes['callback'] := 'false';
xNode2 := xNode2.AddChild('exp');
xNode2.Attributes['resType'] := ADataTypeToStr(AExp.ResType);
xNode2.Attributes['expType'] := AExpTypeToStr(AExp.ExpType);
xNode2.Attributes['exptext'] := AExp.FExpText; XMLDocument.SaveToStream(ss); Result := ss.DataString;
finally
ss.Free;
end;
end;
Panel := TPanel.Create(nil);
XMLDoc := TXMLDocument.Create(Panel);
这样就可以了。