admin 管理员组文章数量: 1087139
2024年4月25日发(作者:emerges)
Delphi解析XMl文件[不是原创]
对于XML的解析主要有 DOM(文档对象模型) 和SAX(Simple API for
XML)。DOM是通过构建内存对象来完成XML的解析, 后者则是将解析过程转
换为事件驱动。
Delphi提供了三种DOM解析程序:MSXML, Open XML,Xerces XML。
MSXML是微软提供的解析程序,被实现为一系列的COM对象, 主要包
括 msxml, msxml3a.dll, msxmll 三个动态链接库。
这里我只说一下通过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 := TXMLDocumeeate( ‘d:test.xml’ );
XMLDocument.Active := True;
XMLNode := XMLDocumen.Document.Element;
Memo1.Line.Add( ‘根节点的名字为:’ + XMLNode.Name );
Memo1.Line.Add( ‘根节点下的子节点数目为: ‘ +
IntToStr( XMLNodldNodunt ));
XMLNode := XMLNoildNodes.Node[2]; // 将当前访问的节点的第三个子节点
置为要访问的节点memo.
Memo( ‘根节点下的第三个子节点的名字’ + XMLNode.Name );
if XMLNode.HasAttribute( ‘color’ ) then
Memo1.Line.Add( ‘该节点的属性color:’ + XMLNode.Attribute[‘color’] )
Else
Memo1.Line.Add( ‘该节点没有属性 color, 或者大小写不正确!’ );
If XMLNode.IsTextElement then
Memo( ‘该节点包含有内容Text: ‘ + XMLNode.Text )
Else
Memo1.Line.Add(‘该节点为非叶子节点, 不能包含内容Text!’ );
XMLNode := nil;
XMLDocument.Free;
XMLDocument := nil;
End;
节点内的属性读取还有个快捷方法。通过 IXMLNode 的AttributeNodes 属性,能将
该Node 的属性以节点的方式映射出来。 这样通过 NodeName 和NodeValue 属性就
能读出每个属性的值。AttributeNodunt 说明了该节点包含的属性个数。如下
面的代码片断。
// 获取指定的节点
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
sltAttributeNam( XMLNode.AttributeNodes.Nodes[i].NodeName );
sltAttributeValue.Add( XMLNotributeNoddes[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:AppServwwwxmltest.xml' ); // 这个方法也是由向导生
成的。
memnes.Add(xm[1].name); // 比如我要取得data下的第2个row 中
的name属性。
Memo1.Lines.Add( xml.Memo.Color ); // 访问Memo节点中的属性 color
Memnes.Add( xxt ); // 访问 Memo 节点中的属性 Text。
………………..
这种方法很简单, 不过它有一个局限性, 就是一个接口单元只能对应的解释一种
整体结构一致的XML文档。 但对于一般的小型应用, 也可以考虑使用这个简洁
的方法, 这使我们可以不必取关心这些讨厌的Node对象, 毕竟我们软件中用使
用的每个XML文档都总是有个自己的原生结构的。
另外提一下PHP中的XML解析,它使用的是SAX方式,每读到一个节点就调用
相应的处理函数来完成解析。
关于如何生成XML 文档, 有两种主要方法:
1.通过IXMLNode 对象的AddNode 或者 SetValue来动态的生成。
2.手工,以字符串的形式生成
版权声明:本文标题:delphi7解析XML文件 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1713991648a660892.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论