Delphi中解析Xml的控件-SimDesign NativeXml

Delphi中解析Xml的控件-SimDesign NativeXml

 

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

SimDesign.NativeXml是一个delphibcbXML控件,包含一个精巧的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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NativeXML(也称为nXML)是一个在Delphi环境用于处理XML文件的库。它提供了一种快速、灵活和可靠的方法来解析和生成XML文档。 使用NativeXML进行XML下载可以通过以下步骤完成: 1. 引入NativeXML库:首先,在Delphi的工程引入NativeXML库。这可以通过添加NativeXml.pas文件到工程来实现。 2. 创建NativeXML对象:接下来,创建一个TNativeXml对象。这个对象将用于加载和处理XML文件。 3. 下载XML文件:使用Delphi提供的网络操作方法,下载XML文件到本地计算机或服务器。这可以通过使用TIdHTTP组件来实现。其,URL参数为要下载的XML文件的URL地址。 4. 加载XML文件:使用TNativeXml对象的LoadFromFile或者LoadFromStream方法,将下载的XML文件加载到TNativeXml对象。 5. 处理XML文件:现在,TNativeXml对象已经包含了下载的XML文件。可以使用TNativeXml对象提供的方法和属性来访问和处理XML文档的内容。 例如,可以使用TNativeXml对象的Root属性来获取XML文档的根元素。还可以使用TNativeXml对象的NodeByName、NodeByPath等方法来获取其他元素或属性的值。 6. 保存XML文件(可选):如果需要将已下载和处理的XML文件保存到本地计算机或服务器,可以使用TNativeXml对象的SaveToFile方法或SaveToStream方法。 总之,使用NativeXML进行XML下载,可以方便地将远程XML文件下载到本地,并通过TNativeXml对象进行解析和处理。这使得在Delphi环境使用XML数据变得更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值