posts - 251, comments - 17, trackbacks - 0, articles - 2
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2008年4月9日

创建IXMLDOMDocument对象的三种方法:
(1)[方法1] 直接创建 IXMLDOMDocument  , 例(1)
   uses msxml;
   var DOC:IXMLDOMDocument;
   doc := CoDOMDocument.create;
   .....
   Doc := nil;
 A)doc.load('C:\temp.xml');  //从文件载入
 B) 动态创建

   var aElement,aElement2: IXMLDOMElement;  // [ aNode:IXMLDOMNode ==>  .AppendChild() ]

   //加入版本信息 ‘<?xml version="1.0" ?> ’
   doc.AppendChild(doc.CreateProcessingInstruction('xml', 'version="1.0" encoding="GB2312"'));
     (*)因为此函数返回结果不包含 'encoding="GB2312"' 故须保存前注意.
   //加入根结点
   doc.AppendChild(doc.CreateElement('bootDocNode')); //// == aElement 
   //加入子结点
   aElement:=IXMLDOMElement(Doc.DocumentElement.AppendChild(Doc.CreateElement('ChileNode1')));
   //设置接点属性
   aElement.SetAttribute('ID', '11');
   aElement.SetAttribute('Units', '元/m2');
   //设置结点内容
   aElement.AppendChild(Doc.CreateTextNode('结点内容'));
   //子结点添加子结点
   aElement2:=IXMLDOMElement(aElement.AppendChild(Doc.CreateElement('Child_ChileNode1')));

(2) [方法2] 直接创建 IXMLDocument ( 不是IXMLDOMDocument )
  uses XMLIntf,XMLDoc;
  var xmlDoc:IXMLDocument; aNode:IXMLNode;  s:string;

  xmlDoc := TXMLDocument.Create(nil);
  try
    //加入版本信息 ‘<?xml version="1.0" encoding="GB2312" ?> ’
    xmlDoc.Active := True;   xmlDoc.Version := '1.0';  xmlDoc.Encoding :='GB2312';
    //加入根结点
    aNode:=xmlDoc.AddChild('bootDocNode');
    //加入子结点
    aNode:=aNode.AddChild('ChileNode1');
    //设置接点属性
    aNode.SetAttribute('ID', '22');
    aNode.SetAttribute('Units', '元/m2');
    //设置结点内容
    aNode.Text := '结点内容';
    //子结点添加子结点
    aNode:=aNode.AddChild('Child_ChileNode1') ;
    aNode.Text := 'Child_ChileNod内容';
  
    s := xmlDoc.XML.Text ;  //  .XML 返回的是 Tstrings
  finally
    xmlDoc := nil ;
  end;

(3)利用 XMLDataBinding
    I) 准备好XML文件,此XML文件有较强的代表性,保证程序中所用的结点及其关系都存在
   II)利用 file-->new-->XML Data Binding
  III)创建XML对象
   A)v:string; //XML文件内容
    Doc : IXMLBudgetDocTyp; //IXMLBudgetDocTyp是XML文件的根结点
    Doc := LoadXMLData(v).GetDocBinding('BudgetDoc', TXMLBudgetDocType) as IXMLBudgetDocType;
   B)Doc := LoadBudgetDoc('C:\temp.xml');
  IV) 应用
    Doc.ChildNodes.FindNode('Docfile') as IXMLDocfileType;

(4)利用TXMLDocument控件


 XMLDocument1.fileName:='C:\temp.xml';
    XMLDocument1.active:=true;  // XMLDocument1 相当于 Doc

 

(5)XML对象的其他方法
   IXMLNodeList.FindNode(NodeName: DOMString): IXMLNode;
   IXMLNodeList.FindNode(NodeName, NamespaceURI: DOMString): IXMLNode;
   IXMLNodeList.FindNode(ChildNodeType: TGuid): IXMLNode;
   IXMLNodeList.FindSibling(const Node: IXMLNode; Delta: Integer): IXMLNode;
   IXMLNodeList.First: IXMLNode;
   IXMLNodeList.Last: IXMLNode;
   ... ...
   
////////////////////////////////////////////////////////////////////////
//例(1)
uses msxml;  
    doc:IXMLDOMDocument;
    budgetdoc:ixmlDomNode;
    Rela:IxmlDOMNode;
    rs:ixmldomnodelist;

//建立或取得XML结点
  doc := CoDOMDocument.create;
  doc.load('C:\temp.xml');
  budgetDoc := doc.selectSingleNode('BudgetDoc');
  rela := budgetdoc.SelectSingleNode('Relation');

//创建XML子结点 
  if not assigned(rela) then
  begin
    rela :=  doc.createElement('Relation');
    rela.setAttribute('BudgetId',0);
    rela.setAttribute('name','名称');
    budgetdoc.appendChild(rela);
  end;

//取子结点(序列)
  rs := rela.selectNodes('Rela[@BudgetId="2" and @TaskId="8"]');
  for i := 0 to rs.length -1 do
  begin
    s:= s + rs[i].attributes.getnameditem('NewRate').nodeValue;
  end;
 
  rela:=doc.ChildNodes.FindNode('DOMNode') as IxmlDOMNode;

//移除子结点
    for i := rs.length -1 downto 1 do
      rela.removeChild(rs[i])

//取父结点
    if assigned(anode.parentNode) and (Anode.parentNode.nodeName='Task') then
      result := Anode.parentNode;

//取属性
  DOC.DocumentElement.Attributes['Name']
  rela.Attributes['Name']
  rs.Nodes[i].Attributes['Name']

  Ajob:ixmldomnode;jobs:ixmldomNodeList;
  jobs := Ajob.selectNodes('RCJ[@Attrib="'+AAttrib+'"]')

posted @ 2008-04-09 21:48 dalongzero 阅读(125) 评论(0) 编辑

Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写。可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑、保存操作。TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的。对于DOM接口的实现有多种方式,Delphi支持的方式有:

  1)微软的MSXML SDK,这种方式是通过COM对象来实现;

  2) Apache 的Xerces的实现方式;

  3)另外一种是开源OpenXML实现方式。对于不同的接口实现方式可以通过设定TXMLDocument的DOMVender来进行控制。

  支持XML的Delphi单元主要存在与…\Borland\Delphi7\Source\Xml目录下,主要包括:XMLIntf,XMLDoc,xmldom,msxmldom,xercesxmldom,xdom,oxmldom等单元。

  ·XMLIntf――包括了Borland自己定义的XML文档的接口;

  ·XMLDoc――是对XMLIntf中所定义接口的Borland实现;

  ·Xmldom――定义了DOM(文档对象模型)接口,这里对DOM接口进行了Borland的实现;

  ·Msxmldom――实现微软对Xmldom中定义的接口的实现,主要调用微软的COM对象来实现,对Xmldom中定义接口的封装;

  ·Xercesxmldom――Borland通过Xerces XML DOM方式来实现对Xmldom中定义接口的封装; l Oxmldom――Borland通过使用OpenXML来实现对Xmldom中定义接口的封装;

  TXMLDocument类的属性,请参考Borland的帮助文件;

  读写XML文档

  ·读取XML文档

  通常情况下不通过直接使用TXMLDocument对象来进行XML文件的读取,而是使用XMLDoc单元中提供的几个有用的函数来读取XML文档,这些函数包括:

function LoadXMLDocument(const FileName: DOMString): IXMLDocument;

function LoadXMLData(const XMLData: DOMString): IXMLDocument; overload;

function LoadXMLData(const XMLData: string): IXMLDocument; overload;

function NewXMLDocument(Version: DOMString = '1.0'): IXMLDocument;

  可以看出这些函数全部返回的是IXMLDocument接口,得到了IXMLDocument接口在进行文档的操作;这些函数都是通过创建TXMLDocument对象来实现对XML文档的读取的;其中NewXMLDocument仅仅创建一个IXMLDocument接口。

  可以这样利用NewXMLDocument来读取XML文档:

XMLDoc := NewXMLDocument;

XMLDoc.LoadFromFile(FileName);

  ·保存XML文档

  可以通过下面的方式来保存XML文档:

XMLDoc := NewXMLDocument;

iRoot := IXMLDoc.CreateNode(‘TestXMLDocument’);

XMLDoc.DocumentElement := iRoot;



XMLDoc.SaveToFile(FileName);

  可以看出通过接口来操作XML文档是非常方便的;

  选用不同类型的XML解析方式

  上面已经提到有三种方式实现DOM,也就是可以应用Borland提供的3种不同的XML解析器来对XML文档进行解析;

  ·三种解析器

  1、微软的解析器(MSXML SDK)

  微软解析器主要应用在Windows中,在安装MSXML SDK的时候会安装解析器,同时IE浏览器也提供了解析器,这个解析器是一个COM。

  2、Apache的Xerces解析器

  Borland自己实现了一个Xerces解析器,这个可以通过调用xercesxmldom.dll模块来实现;如果使用这个解析器可能需要同应用程序一起进行分发xercesxmldom.dll,XercesLib.dll,CC3260MT.DLL三个DLL文件

  3、OpenXML解析器

  这个解析器的源代码存在于xdom.pas单元中,这个可以通过http://www.philo.de/xml/进行跟新下载,这个是一个德国人写的XML解析器;

  ·使用不同解析器的比较

  对于三种方式的解析器比较如下:

  1、微软的解析器

  微软的解析器当然好了,但是也不能排除存在的意外情况,在我个人的经验中,至少我们公司对于XML解析的方式,只有在IE6.0以上的版本才能够正常的工作;

  至于,Borland同样是通过引入MSXML.DLL的接口来实现的,所以可以推理出,同样存在同样的问题;这个通过研究TMSDOMImplementation(msxmldom单元中)的实现方式可以得到证明,实现的过程中通过调用CoCreateInstance函数接口来实现解析的;

  在发布解析XML的代码的时候可能就会存在由于IE的本版的不同,需要把IE6.0一同发布,比较麻烦;

  2 、Borland的Xerces解析器

  这种方式的解析器是通过 LoadLibrary(PChar(LibName));函数,LibName的内容是xercesxmldom.dll(Windows平台),libxercesxmldom.so.1(Linux平台)。那么就需要随同应用程序一起发布的Dll,就包括了xercesxmldom.dll,XercesLib.dll,CC3260MT.DLL;

  这个发布相对于发布不同版本的IE6.0来说要相对简单一些;

  3、OpenXML解析器

  由于存在xdom.pas单元,这个单元中包含了完全的XML解析的源代码,那么应用这种方式,可以避免软件发布的种种问题,这是由于解析的代码被静态编译在应用程序内部。唯一不好的地方就是应用程序的体积可能要大一些;

  ·如何使用不同的解析器

  我们可以写一个函数来使用不同的解析器;

function NewDiffXmlDocument(DOMVender: string;

Version: DOMString = '1.0'): IXMLDocument;

var

XMLDoc : TXMLDocument;

begin

XMLDoc := TXMLDocument.Create(nil);

XMLDoc.DOMVendor := GetDOMVendor(DOMVender);

Result := XMLDoc;

Result.Active := True;

if Version <> '' then

Result.Version := Version;

end;

  其中DOMVender如果用Borland提供的三种方式进行解析的话,分别取值是:

  Microsoft――存在于msxmldom.pas单元中的SMSXML常量;

  Xerces――存在于xercesxmldom .pas单元中的SXercesXML常量;

  OpenXML――存在于oxmldom.pas单元中的SOpenXML常量;

  这个是由于在msxmldom,xercesxmldom,oxmldom三个单元的initailization部分,都通过调用RegisterDOMVendor函数,注册了不同的解析器接口;当然,Borland同样提供了一种可以灵活进行扩展的机制来扩展用户自己的解析器,这个需要继承,TDOMVendor类(存在于xmldom单元中)。实际上,Borland自己就是通过这种方式来实现不同方式解析器的;具体的实现过程可以通过参考oxmldom单元中对xdom的封装。

  结论

  Delphi作为一个成功的开发工具,它自身实现的对XML的支持,肯定比网络上某些实现要稳定、高效的多,我们没有必要再进行另外的封装什么MSXML.DLL的COM接口。当然,可以自己实现不同的XML解析器,也可以应用已经存在的解析器。同时,可以看出Delphi对于XML的支持也是非常完善的。

posted @ 2008-04-09 21:45 dalongzero 阅读(92) 评论(0) 编辑

2007年11月25日

 

posted @ 2007-11-25 22:18 dalongzero 阅读(25) 评论(0) 编辑

难得又聚啊,珍惜这时光!
Posted by Picasa

文章来源:http://vrgod.blogspot.com/2007/10/ksec-6.html

posted @ 2007-11-25 22:18 dalongzero 阅读(34) 评论(0) 编辑

Posted by Picasa

文章来源:http://vrgod.blogspot.com/2007/10/5.html

posted @ 2007-11-25 22:18 dalongzero 阅读(40) 评论(0) 编辑

Posted by Picasa

文章来源:http://vrgod.blogspot.com/2007/10/blog-post_27.html

posted @ 2007-11-25 22:18 dalongzero 阅读(35) 评论(0) 编辑


PSP版《恶魔城X 历代记》终于可以下载了,psp又可以有玩的了,赫赫

文章来源:http://vrgod.blogspot.com/2007/10/x.html

posted @ 2007-11-25 22:18 dalongzero 阅读(30) 评论(0) 编辑

故事讲述的是吸血鬼猎人贝尔蒙特一族后代的19 岁青年『李希特·贝尔蒙特』为了救出被吸血鬼之王『德拉古拉』所掳走的爱人『雅妮特』,并为消灭吸血鬼猎人一族而展开的冒险。游戏中除了『李希特』之外,还可以使用他的亲戚、具备召唤圣兽之术的12岁少女『玛莉亚·菈妮特』。

文章来源:http://vrgod.blogspot.com/2007/10/x_31.html

posted @ 2007-11-25 22:18 dalongzero 阅读(36) 评论(0) 编辑


两周来连续遇到多年没见的同学,从小学到大学,从半年没见到10年没见,很庆幸自己并不孤单...

总以为青春是资本,而或许正是有了青春才发现一无所有,回到学校又发现了青春的宝贵。

留不住的时光,让它绽放在凄冷的冷夜




文章来源:http://vrgod.blogspot.com/2007/11/blog-post.html

posted @ 2007-11-25 22:18 dalongzero 阅读(38) 评论(0) 编辑


不要对我说生命中无聊的事
不要对我说胜败是兵家常事
对于我经过的事你又了解多少
在每一个沙场上 胜利总不属于我
我只有低头前进 低头前进


不要对我说生命中辉煌的事
不要对我说失败是命运的事
那些在经验里我只相信一次
因为我和你一样 要这样走过一生
我只有低头前进 低头前进

文章来源:http://vrgod.blogspot.com/2007/11/blog-post_15.html

posted @ 2007-11-25 22:18 dalongzero 阅读(35) 评论(0) 编辑