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. mac地址静态捆绑,防止arp欺骗

    arp -s 192.168.1.101 00-21-CC-D3-D5-FF 缺点,每次关机就还原,所以一般创建批处理文件,开机启动. ping 192.168.1.100 -l 65500 多台肉鸡 ...

  2. HDU 1260 Tickets(基础dp)

    一开始我对这个题的题意理解有问题,居然超时了,我以为是区间dp,没想到是个水dp,我泪奔了.... #include<stdio.h> #include<string.h> # ...

  3. 使用response实现文件下载注意点

    创建web工程,使用response实现文件的下载. 在webRoot下创建download文件,里面包含要下载的文件,现在把源码贴上来,然后再说我遇到的问题 public class DownLoa ...

  4. 深入浅出Ajax(四)

    function initPage() { btn.onmouseover = buttonOver; btn.onmouseover = buttonOut; } 如上,浏览器只会运行指定的最后一个 ...

  5. Button MouseEvent颜色变化

    public partial class Form1 : Form { public Form1() { InitializeComponent(); this.button1.Enter += bu ...

  6. windows server2012 图形加速,玩游戏不掉帧

    研究了很久,其实就是将 电源管理设置成 高级 ....

  7. ExtJS简介--车辆调度

    http://www.cnblogs.com/gaoweipeng/archive/2009/11/11/1599969.html

  8. Unity3d/2d手机游戏开发第二版 (金玺曾) 随书资源

    http://pan.baidu.com/s/1c0xpn4s Unity3d2d手机游戏开发配书资源文件.rar 1.36G 书上的链接坏掉了,我在论坛上面买了一份,放这分享给买了书找不到资源的同学 ...

  9. jar2exe 配置jre

    http://www.regexlab.com/zh/jar2exe/support.htm

  10. Windows Azure Table Storage 解决 Guid 查询问题

    在使用 Windows Azure Table Storage 的 CloudTableClient 对Azure 进行数据查询时,会发现在自定义类的Guid类型始终无法去成功查询出数据,对比发现 G ...