DFM文件与XML文件互转

原创 2004年08月25日 22:17:00

dfm文件是Delphi中存储窗体控件信息的,有时为了对大批量的dfm文件操作(如:批量替换控件、作检查等),往往不是太方便。
XML对结构化的数据读写则很强,将文本类型的dfm转为xml后进行操作,再转回dfm存储大大方便了操作。

 

//DFM to XML
procedure Dfm2Xml(ADfmStrings: TStrings; AXml: IDsXmlDocument);
Var
  i: integer;
  mStr : string;
  mParentNode, mNode : IDsXMLNode;
  mObjName, mClass, mObjType: string;
  mPropName, mPropValue: string;
  mInItem: Boolean;   //有Item的也会有End相对,所以要和Object end分开
begin
  mInItem := False;
  mParentNode := AXML;
  for i:=0 to ADfmStrings.Count - 1 do
  begin
    mStr := trim(ADfmStrings.Strings[i]);
    //对象开始
    if (copy(mStr, 1, 6) = 'object') or (copy(mStr, 1, 9) = 'inherited') then
    begin
      //先写入属性 - 如果还有属性没有写
      if mPropName <> '' then
      begin
        mNode := AXml.createElement(mPropName);
        mNode.text := mPropValue;
        mParentNode.appendChild(mNode);
        mPropName := '';
      end;
      mObjType := CutToken(mStr, ' ');          //Type: object or inherited
      mObjName := CutToken(mStr, ': ');         //ObjName: Ex. frmCmsI03
      mClass := mStr;                           //ClassName: Ex. TButton
      mNode := AXml.createElement(mObjName);
      (mNode as IDsXmlElement).setAttribute('ObjType', mObjType);
      (mNode as IDsXmlElement).setAttribute('Class', mClass);
      mParentNode.appendChild(mNode);
      mParentNode := mNode;
    end
    //对象结束
    else if (mStr = 'end') and (not mInItem) then
    begin
      //先写入属性
      if mPropName <> '' then
      begin
        mNode := AXml.createElement(mPropName);
        mNode.text := mPropValue;
        mParentNode.appendChild(mNode);
        mPropName := '';
      end;
      mParentNode := mParentNode.parentNode;
    end
    //属性处理
    else
    begin
      //有 = 说明是一个属性的新的开始
      if (Pos(' = ', mStr) > 0) and (not mInItem) then
      begin
        //先写入属性
        if mPropName <> '' then
        begin
          mNode := AXml.createElement(mPropName);
          mNode.text := mPropValue;
          mParentNode.appendChild(mNode);
        end;
        mPropName := CutToken(mStr, ' = ');
        mPropValue := CutToken(mStr, ' = ');
      end
      else   //说明这个属性可能有多行
        mPropValue := mPropValue + '#13#10' + mStr;
        if mStr = 'item' then mInItem := True;
        if mStr = 'end' then mInItem := False;
    end;
  end;
end;
//XML to DFM
procedure Xml2Dfm(AXml: IDsXmlDocument; ADfmStrings: TStrings);
  procedure Node2Dfm(ANode: IDsXMLNode; oString: TStrings; IdentSpace: string);
  Var
    mObjName, mClass, mObjType: string;
    mPropName, mPropValue: string;
    mNode : IDsXMLNode;
    i: integer;
    mVar : Variant;
  begin
    mObjName := (ANode as IDsXmlElement).NodeName;
    mClass   := (ANode as IDsXmlElement).getAttribute('Class');
    mObjType := (ANode as IDsXmlElement).getAttribute('ObjType');
    //写入Object begin
    oString.Add(Format('%s%s %s: %s', [IdentSpace, mObjType, mObjName, mClass]));
    //写入属性
    for i:= 0 to ANode.childNodes.length - 1 do
    begin
      mNode := ANode.childNodes.item[i];
      //Has Child 说明是一个新的对象
      mVar := (mNode as IDsXmlElement).getAttribute('ObjType');
      if not varIsNull(mVar)  then
        Node2Dfm(mNode, oString, IdentSpace + '  ')
      //是属性,写进去就好了.
      else
      begin
        mPropName := mNode.nodeName;
        mPropValue := mNode.text;
        mPropValue := StringReplace(mPropValue, '#13#10', #13#10, [rfReplaceAll]);
        //写入:缩进
        oString.Add(Format('%s%s = %s', [IdentSpace+'  ', mPropName, mPropValue]));
      end;
    end;
    //写入End
    oString.Add(Format('%send', [IdentSpace]));
  end;
  
begin
  Node2Dfm(AXml.Get_documentElement, ADfmStrings, '');
end;

用到的类型:

uses
   MSXML2_TLB;
//类型自己重新定义过
type
  IDsXmlDocument = IXMLDOMDocument2;
  IDsXmlNode     = IXMLDOMNode;
  IDsXmlElement  = IXMLDOMElement;
  IDsXmlNodeList = IXMLDOMNodeList;

XML与DataTable/DataSet互转(C#) 把数据库中表的内容转存为XML文件

public class DataToXml { /**//// /// 将DataTable对象转换成XML字符串 /// ...
  • someon2
  • someon2
  • 2014年03月04日 18:48
  • 562

XML和对象相互转换的方法

最近项目中需要用到XML配置一些信息,百度了一下,发现使用XStream相对简单,简单配置一下即可进行转换,方法如下: 首先添加依赖 com.thoughtworks.xs...
  • dreamfly88
  • dreamfly88
  • 2016年09月19日 18:02
  • 2922

Excel与XML相互转换 - C# 简单实现方案

Excel与XML相互转换 - C# 简单实现方案 在日常工作中,我需要将数据存储在Excel中进行数据分析和处理,然后再将数据转换为XML格式进行跨平台的数据交换。网上搜索Excel转换为XML的实...
  • Eiceblue
  • Eiceblue
  • 2017年02月27日 12:39
  • 3355

staxon完美实现Xml与Json互转

Maven包依赖: de.odysseus.staxon staxon 1.2 实现代码: package cn.yangyong.fodder.util; im...
  • waysoflife
  • waysoflife
  • 2015年07月03日 11:25
  • 3592

json,xml,javabean之间的转换

工作中经常要用到Json、JavaBean、Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考。 现在主流的转换工具有json-lib、jackson、fastjson等,我为大家一...
  • u012453193
  • u012453193
  • 2014年10月16日 16:35
  • 636

XStream互转String和XML,以及如何读取web的下的文件

在项目开发中有时要传输xm文件,要转换成字符串传输,而无法使用对象传输,所以要进行转换,所用进行总结下利用XStream进行string与XML对象之间的互转,以及在转换某一包下所有的类。 XML文件...
  • zfc0826
  • zfc0826
  • 2014年07月05日 11:16
  • 1697

xml文件的读写

1,xml文件的读取     读取xml文件的方式有两种,一种是面向模型的DOM方式,一种是面向事件的SAX方式     DOM方式原理:一次性的将xml文档加入内存,在内存中形成一颗do...
  • lishuangzhe7047
  • lishuangzhe7047
  • 2014年02月19日 22:59
  • 12951

java学习——XML文件导入

刚学习java不久,在做DRP分销商管理这个项目中,发现很多新东西,需要我们不断总结。今天我们就来介绍一下导入XML文件。        在实际应用中,导入是一项很重要的功能,一般来说我们常...
  • u010168160
  • u010168160
  • 2015年10月06日 14:30
  • 2088

dwg文件怎么和dxf文件互转

dwg文件和dxf文件在进行操作的时候常常需要互相转换,那么这里就出现了一个问题普通的转换方式已经不再适用现在的作业方式了;进行文件转换的时候我们通常都会想要掌握快速的转换方法,可是很多人并不知道dw...
  • wsxka
  • wsxka
  • 2017年10月19日 11:38
  • 79

VS之XML文件操作

XML,可扩展的标识语言(eXtensible Markup Language),具有多种优势,所以现在被广泛使用,本文通过一个简单的例子来实现对XML文件的保存和读取操作。...
  • bingdianlanxin
  • bingdianlanxin
  • 2015年01月02日 17:03
  • 5409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DFM文件与XML文件互转
举报原因:
原因补充:

(最多只允许输入30个字)