delphi7+ nativexml开发,如何将XML文档(格式固定)进行类化?
XML文档格式(简化)如下:<?xml version="1.0" encoding="GB2312"?>
<DSDOC SORT="公共" DATA="">
<HEADER SOFTWAREID="2011" >
<DATA NAME="Qabc" VER="1.00" DATE="0"/>
<DATA NAME="iLIKEcl" VER="1.00" DATE="0"/>
</HEADER>
<PASS><![CDATA[9ArMO1gjC2+6x42vggWLCDsVLema3YrXv8Z01gY3]]></PASS>
<TProject COSTTYPE="清单" RATETYPE="2011">
<PROJCHA></PROJCHA>
<ITEMS>
<TSubProject EXPANDED="1">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
<TSubProject EXPANDED="2">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
</ITEMS>
</TProject>
</DSDOC>有哪位能将类化后的单元文件,贴 上来一下。
还有,生成类后,是不是还有一个载入XML DOC文档的函数呢?利用这个类如何生一个XML DOC文档呢?附:
我现在用的NativeXml是3.26版,如下
{$ifndef D12up}
type
  UnicodeString = WideString;
  RawByteString = AnsiString;
{$endif}const  // Current version of the NativeXml unit
  cNativeXmlVersion = 'v3.26';--------  
 // Forward declaration of TNativeXml
  TNativeXml = class;  // TXmlNode is the ancestor for all nodes in the xml document. See TsdElement
  // for the elements, TsdAttribute for the attributes.
  TXmlNode = class(TDebugPersistent)
  private
    // inherited from TDebugPersistent: FOwner: TDebugComponent
    FParent: TXmlNode;
......

解决方案 »

  1.   

    很难,除非通过DELPHI的脚本语言
      

  2.   

    Delphi端定义 映射类了吗
      

  3.   

    其实就XML 的类映射
      

  4.   

    为什么要类化呢?
    需要生成源代码参与编译,多麻烦啊。。所以楼上有人说要用脚本其实,实现一个类,按名从xml里取值(如果需要,加上能写值的功能),就行了!
    这样的一个类是通用的,变的只是xml这个数据内容而已
    如果类化,类也要随着xml的结构变化而变化,才是麻烦
      

  5.   

    XML 结构是固定的
    类化,开发时较方便 。
      

  6.   

    感觉就是DELPHI 太老了,很多新型的技术,当初DELPHI就没考虑到,导致从OBJECT 就开始脱节。所以没办法
      

  7.   

    XML文档的结构较复杂,属性多,层次深
    所以要类化。
      

  8.   

    我说的不知道你是否明白Delphi的键值列表 比如Stringlist  
      sl.name['Caption']:='值';  sl.name['XXXX']:='XX';这样描述下去不就是一个简单类吗如果如果存在对象层次可以通过 SL.ADDOBJECT('Child',object);
    实现 
    实在不行自己定义一个 列表类,通过XML的循环类似添加
      

  9.   


    键值列表取代 完全可以 表达一个复杂的xml的
    这个我专门用ini实现过的:多层次、重复 都能够存储
    这个东西,我的做法就是一个通用的解释类,把xml或ini当成一个大数据域就行了
    当然,这样做的前提是 按名存取 的速度 要与 按类/结构取域 的速度差不多
    xml可能就会差多了,ini则真的是差不多
      

  10.   

    楼上的老大,能不能按XML结构写个调用 的例子呢?谢谢啦
      

  11.   


    unit UntClassDef;interfaceuses
      Windows, Classes, SysUtils, Parser, Dialogs, IdGlobal, StrUtils,
      IniFiles, Graphics, Forms, DB, ADODB, Gauges, Variants, NativeXML;const
      //节点名
      xmlDocRootNodeName = 'HYMAKEESTDOC';  //文档的根名称
      xmlHEADERNodeName = 'HEADER';         
      xmlDATANodeName = 'DATA';
      xmlPASSNodeName = 'PASS';            
      xmlTProjectNodeName = 'TProject';    
      //以下各节点都是 'TProject' 的子节点
        xmlPROJCHANodeName = 'PROJCHA';
        xmlITEMSNodeName = 'ITEMS';
       //以下各节点都是 'ITEMS' 的子节点
          xmlITEMSNodeName = 'TSubProject';
          xmlITEMSNodeName = 'RESVALUESET';type
      TMyNode = class(TXmlNode)
      private
        //Get,Set 方法,要写哪些?
      public
        //这里写什么呢?  published
        //这里写什么呢?
      end;  TXMLHYMAKEESTDOCType = class;  
      THEADER = class;
      THeaDataList=class;
      THeaDATA = class;
      TPASS = class;
      TProjectItem = class;
      TPROJCHA = class;
      TSubProject=class;
      TRESVALUESET=class;
      TRESVALUESETList=class;
      TRESVALUESETItem=class;
      TITEMS=class;{ TXMLHYMAKEESTDOCType }  //根节点的类  TXMLHYMAKEESTDOCType = class(TMyNode)
      protected
        function GetSORT: WideString;
        function GetDATA: WideString;
        function Get_HEADER: THEADER;   //子节点
        function Get_PASS: WideString;  //子节点
        function Get_TProject: TProjectItem;   //子节点
        procedure SetSORT(const Value: WideString);
        procedure SetDATA(const Value: WideString);
        procedure Set_PASS(const Value: WideString);  
      public  
        //构造函数
        constructor Create(ADocument: TNativeXml);override;
        //析构函数
        destructor Destroy; override;
      end;......implementationfunction LoadXmlDOC(const FileName: WideString):TXML...... ;
    //这里应该还有一个载入XML文档的函数,要怎么写呢?
    ..............
    { TPass }constructor TPass.Create(ADocument: TNativeXml);
    begin
      inherited;
      Name := xmlPASSNodeName;   //上面定义的常量
    end;destructor TPass.Destroy;
    begin  inherited;
    end;function TPass.GetPASS: String;
    begin
      Result := AttributeByName['PASS'].Value;
    end;procedure TPass.SetPASS(const Value: String);
    var
      Index: Integer;
    begin
      Index := AttributeIndexByname('PASS');
      //Value:=[XmlDoc.NodeNewTextType('CDATA1', Value, xeCData)];
      if Index > -1 then
        AttributeValue[Index] := Value
      else
        AttributeAdd('PASS', Value);
    end;...................
    整个类要怎么完整的写?
      

  12.   

    xml mapper
      

  13.   

    项目要求不用 IXMLDOCOMENT ,改用 NativeXml 控件,所以不用 xml mapper
      

  14.   

    I think you can follow below approach to define a layer for xml data binding yourself.
     ......
      THeaderItem = class(TCollectionItem)
      private
           FName : WideString;
           FVer : String;
           FDate : String;
      published
           property NAME : WideString read FName write FName;
           property VER : String read FVer write FVer;
           property Date : String read FDate write FDate;
      end;  THeader = class(TCollection)
       private
         FID : String;
         FName : WideString;
         function GetItem(Index : Integer) : THeaderItem;
       public
          function Add : THeaderItem;
          property DATA[Index : Integer] : THeaderItem read GetItem;
       published
          property SOFTWAREID : String read FID write FID;
          property NAME : Widestring read FName write FName;  end;  TDSDoc = class(Tpersistent)
      private
          FSort : WideString;
          FData : WideString;
          FHeader : THeader;
      public
          constructor create;
      published
          property SORT : WideString read FSort write FSort;
          property DATA : WideString read FData write FData;
          property HEADER : THeader read FHeader write FHeader;
      end; ....
    PS Code above is just to give you heads up on how you can implement your requirements. For methods to read and/or save the object to/from XML, take a look at NativeXmlObjectStorage.pas that comes with NativeXML package. Especially the methods ObjectLoadFromXmlFile and ObjectSaveToXmlFile.But I believe you will have to write your own methods as you needn't to use RTTI since you already know the structure of XML + Object.Hope it helps.//Ali
      

  15.   

    Thank you ,AliNaqvi
      

  16.   

    请问各位大虾,哪里能下载SimDesign NativeXml的控件包,能够指导一下,刚开始学,有点懵