Delphi中解析Xml的控件-SimDesign NativeXml

正在学习,感觉应用很方便。无源代码的版本还是免费的。

SimDesign.NativeXml是一个delphi和bcb的XML控件,包含一个精巧的Delphi XML执行,使你能在程序中读写XML文档。

http://www.simdesign.nl/xml.html

网上有一个利用SimDesign.NativeXml生成XML的例子。

一个更加强大易用的XML库 -- NativeXML

原来一直使用Delphi自带的TXMLDocument类来进行XML文件的读写,虽然麻烦了一点,但功能上来说还不错。只是有一个地方让我实在不舒服 - 每次创建TXMLDocument类实例的时候必须传入TComponent对象,这就意味着,如果我把对XML文件的读写封装到一个类里面,那么在创建这个自定义类的时候就必须也传入TComponent对象。

我尝试过很多方法,但是都无法避免,最后试着上网找了找,于是就找到了NativeXML这个库。

下载之后马上打开Demo看了看,cool,创建TNativeXML的时候只需要传入xml文件路径就可以,再往下看就让我开始惊喜了。它已经把大多数操作都封装好了,而且还具有把任意对象序列化的能力。

比如,你能把整个Form通过 TsdXmlObjectWriter = class(TPersistent) 类存入一个XML文件,下次再读取。这样使得远程传输对象变得很简单了。

下面就是一个使用NativeXML库的例子:

目标XML结构:

<bookshift>

<book author = "test_author">

<date>2000-01-01</date>

</book>

</bookshift>

delphi 代码:

procedure WriteTest;

var

xml : TNativeXML;

n_bs : TXMLNode;

begin

//

建立根节点

xml := TNativeXml.CreateName('bookshift');

xml.EncodingString := 'GB2312';

//

输出风格为易读

xml.XmlFormat := xfReadable;

//

建立Book节点

n_bs := xml.Root.NodeNew('book');

//

写入Book节点的属性

n_bs.WriteAttribuiteString('author','test_author');

//

建立Book节点下属date节点并写入值

n_bs.WriteString('date','2000-01-01');

xml.SaveToFile('test.xml');

end;

打开test.xml文件看看吧,和上面的格式一摸一样。很简单吧,我用这个库重写了原来的XML访问类,大约节省了40%的代码量。SimDesign.NativeXml自带的读取XML文档的例子。

注意:以下代码转贴时有误,未经测试

{ Example 3

Demo unit that shows how to import XML data into record structure.

It is a "real-life" example written for one of our customers.

It shows how to use the method "NodesByName", creating a temporary

list of node elements with the same name.

It uses NativeXml to handle the conversion.

This was the original request for the conversion:

" Data should be placed in a record with this structure:

type

FieldRecord= record

FieldId: String;

FieldReq: String;

FieldType: String;

FieldCap: String;

DependField: String;

MetaType: String;

MetaData: String;

End;

De enums and the hashtables must be stored in MetaData,

in the following manner:

Enums: enumvalue

_id1 + ',' + enum_caption1 + ";" +  enumvalue

_id2 + ',' + enum_caption2 + ";" + etc.....

HashTable: codeid1 + ',' + hashdata1 + ';'  +

codeid2 + ',' + hashdata2 + etc......

If there's no MetaData the field should remain empty. "

Author: Nils Haeck, Simdesign

http://www.simdesign.nl

More info at:

http://www.simdesign.nl/xml.html

}

unit Example3Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, NativeXml, ComCtrls;

type

// This is the record structure

FieldRecord= record

FieldId: String;

FieldReq: String;

FieldType: String;

FieldCap: String;

DependField: String;

MetaType: String;

MetaData: String;

end;

//////////////////////////////////////////////////////////////////

TForm1 = class(TForm)

mmXML: TMemo;

btnImportXML: TButton;

lbStatus: TLabel;

Label1: TLabel;

lvTable: TListView;

Label2: TLabel;

Label3: TLabel;

procedure btnImportXMLClick(Sender: TObject);

procedure lvTableData(Sender: TObject; Item: TListItem);

private

public

Fields: array of FieldRecord; // This is a dynamic array of records

procedure LoadFieldFromNode(var AField: FieldRecord; ANode: TXmlNode);

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btnImportXMLClick(Sender: TObject);

// Read XML from TMemo and convert into record structure

var

i: integer;

ADoc: TNativeXml;

ANode: TXmlNode;

AList: TList;

begin

ADoc := TNativeXml.Create;

try

// Read from memo

ADoc.ReadFromString(mmXML.Text);

// A temporary list to hold references to the record elements

AList := TList.Create;

try

ANode := ADoc.Root.NodeByName('fields');

if not assigned(ANode) then exit;

// List of nodes that are named "field"

ANode.NodesByName('field', AList);

// Set dynamic array length

SetLength(Fields, AList.Count);

// Import each element

for i := 0 to AList.Count - 1 do

LoadFieldFromNode(Fields[I], AList[I]);

// Show table

lvTable.Items.Count := AList.Count;

lvTable.Invalidate;

// Status

lbStatus.Caption := Format('Imported %d records', [AList.Count]);

finally

AList.Free;

end;

finally

ADoc.Free;

end;

end;

procedure TForm1.LoadFieldFromNode(var AField: FieldRecord;

ANode: TXmlNode);

// Load one field from the XML element ANode

var

i: integer;

AMeta: TXmlNode;

AEnum: TXmlNode;

AList: TList;

begin

with AField, ANode do begin

// Initialize record

FillChar(AField, SizeOf(AField), 0);

// The flat data

FieldId      := AttributeByName['id'];

FieldReq     := AttributeByName['required'];

FieldType    := AttributeByName['type'];

FieldCap     := ReadString('caption');

DependField  := AttributeByName['dependsfield'];

// Meta data

AMeta := NodeByName('metadata');

if assigned(AMeta) then

with AMeta do

begin

MetaType := AttributeByName['type'];

///////////////////////////////////////////////////////////////

// List that holds enumeration

AList := TList.Create;

try

// "enum" metadata

if MetaType = 'enum' then

begin

AEnum := NodeByName('enumeration');

if assigned(AEnum) then

AEnum.NodesByName('enumvalue', AList);

// all enumeration values

for i := 0 to AList.Count - 1 do

with TXmlNode(AList[I) do

MetaData := MetaData +

AttributeByName['id'] + ',' + ReadString('caption') + ';';

end;

// "hashtable" metadata

if MetaType = 'hashtable' then

begin

AEnum := NodeByName('hashtable');

if assigned(AEnum) then

AEnum.NodesByName('code', AList);

// all enumeration values

for i := 0 to AList.Count - 1 do with TXmlNode(AList[I]) do

MetaData := MetaData +

AttributeByName['id'] + ',' + valueAsString + ';';

end;

finally

AList.Free;

end;

end;

end;

end;

procedure TForm1.lvTableData(Sender: TObject; Item: TListItem);

// Add data to each item in the listview. We use the listview with OwnerData

begin

if (Item.Index >= 0) and (Item.Index < Length(Fields)) then

begin

with Fields[Item.Index] do

begin

Item.Caption := FieldID;

Item.SubItems.Add(FieldReq);

Item.SubItems.Add(FieldType);

Item.SubItems.Add(FieldCap);

Item.SubItems.Add(DependField);

Item.SubItems.Add(MetaType);

Item.SubItems.Add(MetaData);

end;

end;

end;

end.

Delphi中解析Xml的控件-SimDesign NativeXml的更多相关文章

  1. 对delphi中的数据敏感控件的一点探索

    一直对delphi数据敏感控件很好奇,感觉很神奇.只要简单设置一下,就显示和编辑数据,不用写一行代码. 如果不用数据敏感控件,编辑一个表字段数据并保存,我相信应用如下代码. Table1.edit, ...

  2. delphi中使用MSWINSCK.OCX控件

    1.首先是把winsck控件导入到delphi中,就是导入一个ActiveX控件,步骤略过. 2.将导入的winsck控件拖入你的Form中. 3.对winsck进行基本设置(IP,Port). 4. ...

  3. Delphi 中TWebBrowser的扩展控件TExWebBrowser

    主要扩展了3D界面.右键菜单.是否显示图片.是否支持JAVA等功能. 代码如下: unit ExtWebBrowser; interface uses Windows, SysUtils, Class ...

  4. Delphi下使用Oracle Access控件组下TOraSession控件链接

    Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用  orsn1.Options.Direct:=true;  orsn1.Server:=IP:Port: ...

  5. Delphi 10 Seattle 小票打印控件TQ_Printer

    TQ_Printrer控件,是一个为方便需要控制打印命令而设计的跨平台专用控件,已包含标准ESC/POS打印控制的基本指令在内(这些基本指令已能很好的满足多数项目使用). TQ_Printrer控件让 ...

  6. android中一个评分的控件

    RatingBar android中一个评分的控件 如何使用 Android Studio下: dependencies { compile 'com.hedgehog.ratingbar:app:1 ...

  7. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  8. WinForm/Silverlight多线程编程中如何更新UI控件的值

    单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...

  9. HTML中禁用表单控件的两种方法readonly与disabled

    时候我们会希望表单上的控件是不可修改的,比如在修改密码的网页中,显示用户名的文本框就应该是不可修改状态的,下面与大家分享下禁用表中控件的两种方法 在网页的制作过程中,我们会经常使用到表单.但是有时候我 ...

随机推荐

  1. 超级素数(sprime)

    超级素数(sprime) 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如:373->37->3这是一个长为3的超级素数. 输入 输入一个整数n (10≤n ...

  2. pycharm 安装venv的依赖包

    (venv)$ pip install -r requirements.txt

  3. make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]

    主要原因是编译时未连上网,编译时需要下载些插件,连接网后,重启下系统再编译下.

  4. 根据html生成Word文件,包含图片

    根据html内容生成word,并自动下载下来.使用到了itext-1.4.6.jar import java.io.File; import java.io.FileInputStream; impo ...

  5. 【HighCharts系列教程】四、颜色属性——colors

    一.Colors属性说明 配置Colors,可以自定义数据列的颜色. 默认下colors就包含一系列颜色,在个性化或需要调整颜色的顺序下,我们可以配置该属性. 二.colors属性详解 Colors属 ...

  6. [转] Eclipse中已安装的插件如何卸载

    转自 : http://blog.csdn.net/macong01/article/details/7631105 最近在Eclipse中安装了一个插件,导致Eclipse使用的时候有些问题,就找了 ...

  7. libthread_db

    http://timetobleed.com/notes-about-an-odd-esoteric-yet-incredibly-useful-library-libthread_db/

  8. object - c 在URL中截取特定参数的值

    #pragma mark - 获取url特定的参数 -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSE ...

  9. 更多文章请关注公众号:FullStackPlan 或前往个人主页:www.linbingdong.com

    个人主页:www.linbingdong.com 扫一扫关注公众号: FullStackPlan 获取更多干货哦~

  10. NIO 入门基础

    输入/输出:概念性描述 I/O 简介 I/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是 ...