实现为一系列的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; // 将当前访问的节点的第三个子节点置为要访问的节点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需