Delphi操作XML简介

参考:http://www.delphifans.com/InfoView/Article_850.html

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

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

2)Apache的Xerces的实现方式

3)另外就是开源的OpenXML的实现方式。

  对于不同的接口实现方式可以通过设定TXMLDocument的DOMVender来进行控制。  

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

1)XMLIntf-----包括了Borland自己定义的XML文档接口

2)XMLDoc-----是对XMLIntf中所定义接口的Borland实现

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

4)Msxmldom-----实现微软对Xmldom中定义的接口的实现,主要调用微软的COM对象来实现,对Xmldom中定义接口的封装

5)Xercesxmldom-----Borland通过Xerces XML DOM 方式来实现对Xmldom 中定义接口的封装

6)Oxmldom-----Borland通过使用OpenXML来实现对Xmldom中定义接口的封装

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

读写XML文档

  1)读取XML文档

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

1.function LoadXMLDocument(const FileName :DOMString): IXMLDocument
2.function LoadXMLData(const XLData :DOMString): IXMLDocument; overload;
3.function LoadXMLData(const XMLData: string):IXMLDocument; overload;
4.function NewXMLDocument(Version:DOMString=‘1.0‘): IXMLDocument;

  可以看出这些函数全部返回的是IXMLDocument接口,得到了IXMLDocument接口再进行文档的操作;

  这些函数都是通过创建TXMLDocument 对象来实现对XML文档的读取的;其中NewXMLDocument仅仅创建一个IXMLDocument的接口

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

XMLDoc := NewXMLDocument;
XMLDoc.LoadFormFile(FileName);

  2)保存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中,在按炸ungMSXML 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(DOMVendor: string; Version : DOMString = ‘1.0‘): IXMLDocument;
var
    XMLDoc : TXMLDocument;
begin
    XMLDoc := TXMLDocument.Create(nil);
    XMLDoc.DOMVendor := GetDOMVender(DOMVendor);
    Result := XMLDoc;
    Result.Active := True;
    if Version <> ‘‘ then
        Result.Version := Version;
end;

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

1)MicroSoft-----存在于msxmldom.pas单元中的SMSXML常量

2)Xerces-----存在于xercesxmldom.pas单元中的SXercesXML常量

3)OpenXML-----存在yuoxmldom.pas单元中的SOpenXml常量

  这是由于在msxmldom、xercesxmldom、oxmldom三个单元的 initialization部分,都通过调用RegisterDOMVendor 函数,注册了不同的解析器接口

  当然,Borland同样提供了一种可以灵活进行扩展的机制来扩展用户自己的解析器,这个需要继承,TDOMVendor类(存在于xmldom单元中)。实际上,Borland自己就是通过这种方式来实现不同方式解析器的;具体的实现过程可以参看oxmldom单元中对xdom的封装。

结论

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

时间: 2024-11-05 17:32:24

Delphi操作XML简介的相关文章

Delphi 操作 XML(一)

一.欢迎 本帮助文件提供从SimDesign BV的NativeXml组件的信息. 二.购买NativeXml! NativeXml现在是开源的,但支持是仅专门适用于购买NativeXml的客户. 您可以通过此链接购买NativeXml:http://www.simdesign.nl/xml.html 价格:29.95欧元 采购NativeXml的优势: 两年的通过电子邮件或特殊的"NativeXml Source"论坛支持,接收测试和修正,并从"NativeXml Sour

delphi 操作 XML (二)

在装有Win7 32位系统的台式机上 先卸载旧驱动,再重新安装. 对设备管理器里的U转串口设备从本地更新驱动,选择下图文件 系统弹出红色提示框(是否安装XXXX驱动),选择安装,随后该设备由无法启动变为工作正常. 在Win8 64位系统上 安装驱动后,出现下图情况,设备无法启动(错误代码10) 选择08年的驱动后,串口恢复正常. 总结 这些驱动有很多不兼容的,特别是在高级Windows版本或64位系统上,解决的思路就是多尝试安装各种版本,并根据串口状态调整安装策略. delphi 操作 XML

Delphi操作XML - 冰雪傲骨

Delphi操作XMl,只要使用 NativeXml.我是用的版本是4.02.NativeXML的使用方法比较简单,但是功能很强大. XE2的话,要在simdesign.inc后面加上: // Delphi XE2 / 16 {$ifdef VER230} {$define D7UP} {$define D10UP} {$define D15UP} {$endif} 一.使用 1) Copy the NativeXml files from the NativeXml directory int

delphi操作xml学习笔记 之一 入门必读

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

Java Stax操作XML简介

使用stax操作xml 非常的简单,它的读取过程像是一个光标在移动.针对不同的节点做不同的处理. 先看一个基于光标的模型处理xml: public class StaxTest { @Test public void test1() { try { // 1.构建XMLStreamReader XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory .createXMLSt

Delphi操作XML的几个博客

http://www.cnblogs.com/acuier  整整十几篇,省得我自己研究,学一下就可以了. 测试颜色: // 找到了WM_PAINT消息处理,既然找到了,那么对WM_PAINT消息也算有个交代了,于是上面所有的WndProc全部正常结束. // 除非TWinControl.WMPaint里面再继续执行复杂的调用,否则Button1.Update就算执行结束了. procedure TWinControl.WMPaint(var Message: TWMPaint); var DC

PHP操作XML详解

XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据.在实际应用中,一些简单的.安全性较低的 数据往往使用 XML文件的格式进行存储.这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度.        PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序.本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍. 1 XML简介 XML是“可扩展性标识语言(

php simpleXML操作xml的用法

XML简介 XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据.在实际应用中,一些简单的.安全性较低的数据往往使用 XML文件的格式进行存储.这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度. PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序.本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍. 1 XML简介 XML是“可扩展性标识语言(eX

7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

 数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDefault.xml.所有的key皆为char *型,value类型为bool intfloat double std::string. 读操作 bool getBoolForKey(const char* pKey); bool getBoolForKey(const char* pKey, bool