关于动态创建的TXMLDocument的问题??? ( 积分: 100 )

W

WFSMoon

Unregistered / Unconfirmed
GUEST, unregistred user!
TXMLDocument在动态创建时,必须用Create(Application)
但是由于我想写一个纯数据类,不想引用Forms单元,但是如果直接用Create(nil),
在读入文件后,会找不到根接点。
XMLDocument2 := TXMLDocument.Create(nil);
XMLDocument2.LoadFromFile('C:/TEST1.xml');
XMLDocument2.Active := True;
Root := XMLDocument2.DocumentElement;
/////在此会报错
请问有谁知道原因,应该怎么解决这个问题。
 
TXMLDocument在动态创建时,必须用Create(Application)
但是由于我想写一个纯数据类,不想引用Forms单元,但是如果直接用Create(nil),
在读入文件后,会找不到根接点。
XMLDocument2 := TXMLDocument.Create(nil);
XMLDocument2.LoadFromFile('C:/TEST1.xml');
XMLDocument2.Active := True;
Root := XMLDocument2.DocumentElement;
/////在此会报错
请问有谁知道原因,应该怎么解决这个问题。
 
http://qc.borland.com/wc/qcmain.aspx?d=6152
var
myXML : IXMLDocument;
begin
myXML := TXMLDocument.create(nil);
这个方法不错。
 
其实你看看 TXMLDocument 的实现就明白了
由于 TXMLDocument 是纯接口的方式实现的,如果传入 owner,TCompment 的 com 机制将被屏蔽而没有任何问题,如果 owner 是 nil,只要引用计数为 0 对象将被自动释放。正确的使用方法是直接使用接口:IXMLDocument 变量:
function TMainForm.CreateXMLDoc(AWithHeader: Boolean): IXMLDocument;
procedure SwitchDomVendor(AXMLDoc: TXMLDocument);
begin
if RadioButton1.Checked then
AXMLDoc.DOMVendor := MSXML_DOM
else
if RadioButton2.Checked then
AXMLDoc.DOMVendor := OpenXMLFactory
else
AXMLDoc.DOMVendor := XercesDOM;
end;
const
defXMLDocVersion = '1.0';
defXMLDocEncoding = 'UTF-8';
var
XMLDoc: TXMLDocument;
begin
XMLDoc := TXMLDocument.Create(nil);
SwitchDomVendor(XMLDoc);
Result := XMLDoc;
if AWithHeader then
with Resultdo
begin
Active := True;
Version := defXMLDocVersion;
Encoding := defXMLDocEncoding;
end;
end;

使用:
procedure TMainForm.LoadFromXML1;
var
RootNode: IXMLNode;
Node: IXMLNode;
I: Integer;
XMLDoc: IXMLDocument;
begin
{$IFDEF XML_VCL}
XMLDoc := CreateXMLDoc(True);
XMLDoc.LoadFromFile(defAttribsFile);
RootNode := XMLDoc.DocumentElement;
Assert(RootNode <> nil);
for I := 0 to RootNode.ChildNodes.Count - 1do
begin
Node := RootNode.ChildNodes.Get(I);
Assert(Node <> nil);
TTestObject(FList.Items).Property1 := Node.Attributes['Property1'];
TTestObject(FList.Items).Property2 := Node.Attributes['Property2'];
TTestObject(FList.Items).Property3 := Node.Attributes['Property3'];
TTestObject(FList.Items).Property4 := Node.Attributes['Property4'];
TTestObject(FList.Items).Property5 := Node.Attributes['Property5'];
TTestObject(FList.Items).Property6 := Node.Attributes['Property6'];
TTestObject(FList.Items).Property7 := Node.Attributes['Property7'];
TTestObject(FList.Items).Property8 := Node.Attributes['Property8'];
TTestObject(FList.Items).Property9 := Node.Attributes['Property9'];
end;
end;
 
LSUPER:
按你说的用接口变量的方法问题解决了。但我想问一下DOMVendor属性是什么属性?
OpenXMLFactory,XercesDOM的定义在哪儿?有什么区别?
 
接受答案了.
 
其实 delphi 的 xml 控件中封装了三套 xml 解析引擎,分别是 ms 的 com 对象do
m;开源的 openxml;来自于 apache 的 xercess
使用的 pas 参照:
C:/Program Files/Borland/Delphi7/Source/Xml
我做过测试,最快的是 apache 的,然后是 openxml,ms 的最慢!
不过发布时:apache 需要 3 个额外的 dll;ms 的需要 msxml 运行库;而 openxml 是纯 vcl 实现
 
顶部