使用Delphi解析XML 文档

使用Delphi解析XML 文档

[ 2005-08-24 13:17:23 | 作者: cyberfan ]
字体大小: | |
对于XML的解析主要有 DOM(文档对象模型) 和SAX(Simple API for XML)。DOM是通过构建内存对象来完成XML的解析, 后者则是将解析过程转换为事件驱动。

Delphi提供了三种DOM解析程序:MSXML, Open XML,Xerces XML。MSXML是微软提供的解析程序,被实现为一系列的COM对象, 主要包括 msxml3.dll, msxml3a.dll, msxml3r.dll 三个动态链接库。

这里我只说一下通过IXMLDocument来完成XML的解析, 这里你只需要关心节点Node和节点集合NodeList 接口(Interface)既完成XML对象的获取 ,这也是我们通常会使用的方法。

首先我们来看一种通过遍历节点的方法,先来熟悉几个属性:

Version :WideString 文档的版本号。

DocumentElement :IXMLNode 根节点, 比如上面实例的对象。通过根节点您就能开始遍历整个XML节点数.

ChildNodes :IXMLNodeList 当前节点的子节点集合。

Node[ Nodeindex or NodeName ] :IXMLNode XML的节点。 通过节点,您可以通过它的Text ,attribute 属性来获取节点的内容和属性。也可以使用GetNode、Get方法来获取节点。



对,没错,就是这么几个关键的属性就可以完成XML的解析工作。通过下面的示范程序您可以了解如何通过这几个属性来从XML中获取我们想要的信息。

Var XMLDocument :IXMLDocument;

XMLNode :IXMLNode;

begin

XMLDocument := TXMLDocument.Create( ‘d:/test.xml’ );

XMLDocument.Active := True;

XMLNode := XMLDocumen.Document.Element;

Memo1.Line.Add( ‘根节点的名字为:’ + XMLNode.Name );

Memo1.Line.Add( ‘根节点下的子节点数目为: ‘ + IntToStr( XMLNode.ChildNodes.Count ));

XMLNode := XMLNode.ChildNodes.Node[2]; // 将当前访问的节点的第三个子节点置为要访问的节点memo.

Memo1.Line.Add( ‘根节点下的第三个子节点的名字’ + XMLNode.Name );

if XMLNode.HasAttribute( ‘color’ ) then

Memo1.Line.Add( ‘该节点的属性color:’ + XMLNode.Attribute[‘color’] )

Else

Memo1.Line.Add( ‘该节点没有属性 color, 或者大小写不正确!’ );

If XMLNode.IsTextElement then

Memo1.Line.Add( ‘该节点包含有内容Text: ‘ + XMLNode.Text )

Else

Memo1.Line.Add(‘该节点为非叶子节点, 不能包含内容Text!’ );

XMLNode := nil;

XMLDocument.Free;

XMLDocument := nil;

End;

节点内的属性读取还有个快捷方法。通过 IXMLNode 的AttributeNodes 属性,能将该Node 的属性以节点的方式映射出来。 这样通过 NodeName 和NodeValue 属性就能读出每个属性的值。AttributeNodes.Count 说明了该节点包含的属性个数。如下面的代码片断。

// 获取指定的节点

XMLNode := GetNode( strNodePath, intRowIndex, dep );

Result := True;

// End 。

if not assigned( XMLNode ) then

begin

Result := False; // 无效的节点或者该节点不能包括单独的Text

exit;

end;

// 逐个获取该节点的属性和属性值

for i := 0 to XMLNode.AttributeNodes.Count - 1 do

begin

sltAttributeName.Add( XMLNode.AttributeNodes.Nodes[i].NodeName );

sltAttributeValue.Add( XMLNode.AttributeNodes.Nodes[i].NodeValue );

end;

// end .

另外对于一个有固定格式的文档, Delphi还提供了一种叫做数据绑定向导的方法来实现解析。 这样的优点是你根本就不要在取考虑什么节点子节点之类头疼的问题了,通过Delphi向导生成的XML文档接口,你可以像访问普通的对象一样来访问XML中的对象。 下面我们也来谈一下如何通过这种方法来实现解析。

1. 准备好你要解析的XML文档典型实例。这至关重要,因为Delphi需要这个文档来生成一个xdt文档以及相应的对象接口。

2. 窗体中加入TXMLDocument 组件(在Internet页面上),并将其FileName置为要解析的XML文档实例。

3. 右击 TXMLDocument, 在弹出的菜单中选择 XML Data Binding Wizard…

4. 在弹出的向导中, 第一页中, 您可以看到Delphi已经帮您把XML文件中的各个节点对应到了接口,这里你可以展开每个节点,编辑每个节点的属性数据类型。单击Next到下一个配置页面,这里你可以看到Delphi生成了各个节点接口的框架代码。 单击 Finsh 完成向导, 这样Delphi将生成一个xdt 文件和与该XML文档结构对应的XML接口单元(默认是与实例文档同名)。

5. 将Delphi生成的这个接口单元use到您要调用该XML文档的单元中, 以根节点的接口做为入口,你就可以轻松的访问与该XML类似结构的XML文档了。

一下是个小的示范。

var xml :IXMLXMLPackageType; // 通过向导生成的根接口

begin

xml := LoadXMLPackage( 'D:/AppServ/www/xml/test.xml' ); // 这个方法也是由向导生成的。

memo1.Lines.Add(xml.Data.Row[1].name); // 比如我要取得data下的第2个row 中的name属性。

Memo1.Lines.Add( xml.Memo.Color ); // 访问Memo节点中的属性 color

Memo1.Lines.Add( xml.Memo.Text ); // 访问 Memo 节点中的属性 Text。

………………..

end;

这种方法很简单吧, 不过它有一个局限性, 就是一个接口单元只能对应的解释一种整体结构一致的XML文档。 但对于一般的小型应用, 也可以考虑使用这个简洁的方法, 这使我们可以不必取关心这些讨厌的Node对象, 毕竟我们软件中用使用的每个XML文档都总是有个自己的原生结构的。

另外我还想提一下PHP中的XML解析,它使用的是SAX方式,每读到一个节点就调用相应的处理函数来完成解析。有兴趣的朋友可以到我网站上下载一个未整理的资料。

关于如何生成XML 文档, 有两种主要方法:

1.通过IXMLNode 对象的AddNode 或者 SetValue来动态的生成。

2.手工,以字符串的形式生成

我一般更愿意用第2种方法,这也有个小技巧, 你可以先准备好一个XML的框架,然和用字符串替代(format)的方法来填写里面的标记。



XML 封装类

出于XML的树型特性,理论上只要是能遍历的树的方法就能用于遍历XML文档,典型的就是递归和回溯算法了。

你可能感兴趣的:(使用Delphi解析XML 文档)