TXMLDocument换行的两种方案

手写代码:

XML格式化使用msxml引擎,Delphi代码如下:

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

unit uXMLFormat;

interface

uses

  SysUtils, ActiveX, msxml;

        

function PrettyFormat(const AXML: String): String;

implementation

const

  SMSDOMNotInstalled = ‘Microsoft MSXML 4.0 or upper is not installed.‘;

  // msxml parser 4.0

  ProgID_FreeThreadedDOMDocument40 = ‘Msxml2.FreeThreadedDOMDocument.4.0‘;

  // msxml parser 6.0

  ProgID_FreeThreadedDOMDocument60 = ‘Msxml2.FreeThreadedDOMDocument.6.0‘;

type

  EMSXMLDomException = class(Exception);

function TryObjectCreateFromProgID(const ProgIDList: array of PWideChar): IUnknown; overload;

var

  I: Integer;

  FClsID: TGUID;

  Status: HResult;

begin

  for I := Low(ProgIDList) to High(ProgIDList) do

    if Succeeded(CLSIDFromProgID(ProgIDList[I], FClsID)) then

    begin

      Status := CoCreateInstance(FClsID, nil, CLSCTX_INPROC_SERVER or

        CLSCTX_LOCAL_SERVER, IUnknown, Result);

      if Status = S_OK then Exit;

    end;

end;

function CreateDOMDocument: IXMLDOMDocument;

begin

  Result := TryObjectCreateFromProgID([ProgID_FreeThreadedDOMDocument60, ProgID_FreeThreadedDOMDocument40]) as IXMLDOMDocument;

  if not Assigned(Result) then

    raise EMSXMLDomException.Create(SMSDOMNotInstalled);

end;

function PrettyFormat(const AXML: String): String;  

var

  FXMLDoc: IXMLDOMDocument;

  

  procedure TraverseNode(Node: IXMLDOMNode; Indent: string);

  const

    IndentLevel = #9;

  var

    LineBreak: IXMLDOMNode;

    ChildNode, NextNode: IXMLDOMNode;

    AnyChildNode: Boolean;

  begin

    if Node = nil then

      Exit;

    AnyChildNode:= False;

    ChildNode:= Node.Get_firstChild;

    while ChildNode <> nil do

    begin

      NextNode:= ChildNode.nextSibling;

      if ChildNode.nodeType = NODE_ELEMENT then

      begin

        AnyChildNode:= True;

        // Insert LineBreak before each child Node

        LineBreak:= FXMLDoc.createTextNode(sLineBreak +

          Indent + IndentLevel);

        Node.insertBefore(LineBreak, ChildNode);

        TraverseNode(ChildNode, Indent + IndentLevel);

      end;

      ChildNode:= NextNode;

    end;

    if (Node.nodeType = NODE_ELEMENT) and AnyChildNode then

    begin

      // Add LineBreak after Node

      ChildNode:= NextNode;

      LineBreak:= FXMLDoc.createTextNode(sLineBreak + Indent);

      Node.appendChild(LineBreak);

    end;

  end;

begin

  Result := AXML;

  FXMLDoc := CreateDOMDocument;

  if Assigned(FXMLDoc) and FXMLDoc.loadXML(AXML) then

  begin

    TraverseNode(FXMLDoc.documentElement, ‘‘);

    Result := FXMLDoc.xml;

  end;

end;

end.

使用实例:

Delphi/Pascal code

?


1

Memo2.Text := PrettyFormat(‘<root><budded/><who/></root>‘);

格式化后结果:

XML/HTML code

?


1

2

3

4

<root>

    <budded/>

    <who/>

</root>

--------------------------------------------------------------------------------------------------------

无需那么复杂,设置XMLDocument的Options属性就可以了,doNodeAutoIndent 才是关键的。举个例子:

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

uses XMLIntf,XMLDoc;

procedure TForm1.Button1Click(Sender: TObject);

var

    xmlDoc: IXMLDocument;

    aNode: IXMLNode;

begin

    xmlDoc := TXMLDocument.Create(nil);

    try

        // 加入版本信息

        xmlDoc.Active := True;

        xmlDoc.Version := ‘1.0‘;

        xmlDoc.Encoding :=‘GB2312‘;

        xmlDoc.Options := xmlDoc.Options + [doNodeAutoIndent];

        // 加入根结点

        aNode := xmlDoc.AddChild(‘RootNode‘);

        // 加入子结点

        aNode := aNode.AddChild(‘ChildNode‘);

        // 设置子结点属性

        aNode.SetAttribute(‘Name‘‘名称‘);

        aNode.SetAttribute(‘Len‘‘长度‘);

        // 设置子结点内容

        aNode.Text := ‘文本内容‘;

        xmlDoc.SaveToFile(‘C:\ccrun\123.xml‘);

    finally

        xmlDoc := nil ;

    end;

end;

参考:http://bbs.csdn.net/topics/310071629

时间: 2024-10-23 11:06:01

TXMLDocument换行的两种方案的相关文章

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

HBase存储时间相关多列数据的两种方案

所谓“时间相关多列数据”指的是同一个Key下具有多个属性数据,并且这些数据与时间具有相关性,多数场景是该Key对应在不同时间时刻的行为数据.在实际应用中,这类数据很多,例如电子商务网站上用户最近一段时间浏览的宝贝集合.访问的URL列表等. 使用HBase存储此类数据时,有以下两种常用的方案: 多行单列 表结构设计 Row Key:用户标识ID + (Long.MAX_VALUE - timestamp) Column Family:’cf’ Column Qualifier:’’ Value:宝

PHP页面静态化:真静态的两种方案

---------------------------------------------------------------------------------------------- 方案1:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟)/*|------------------| <www.chenwei.ws>|------------------*/header('content-type:text/html;charset=utf-8'); $id = $_

Linux下实现秒级定时任务的两种方案

Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab. 我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次. 以下方法将每20秒执行一次 crontab -e * * * * * /bin/date* * * * * sleep 20;

Linux系统中修改用户名的两种方案整理

在安装系统的时候,经常会无意识的随便起个用户名,后面如果发现该用户名不好或因为环境需要须重起个用户名,经过查找资料和亲自测试发现有两种方案可选:手动修改和使用usermod等命令自动修改. 方案一:手动修改各个关联用户文件 以root身份登录系统文件的修改需要root权限,这里不管是原root用户登录还是普通用户切换到root下都可以,只要有修改权限就行. 修改/etc/passwd这个文件中的用户名部分.用户组部分和主目录部分如我本来的用户名为hadoop,现在想修改为seed,则要修改下面部

apache两种方案三种方式实现反向代理tomcat

目录 1.概述 2.方案一:以proxy_module方式反向代理 3.方案二:以mod_jk方式反向代理 4.总结 1.概述 在前一博客(http://zhaochj.blog.51cto.com/368705/1639740)中实现了tomcat的在standalone模式下的部署,这样tomcat就身兼职两职,一方向要对http的请求作出响应,又要处理JSP程序,而处理http请求不是tomcat的强项,所以这样的请求就交给httpd.nginx这样的的专业处理http请求的套件来处理,而

java调用matlab函数接口的两种方案

Java 调用matlab 函数接口 Java调用matlab函数接口有两种方式: l 一种是通过matlab把函数打成jar包: l 一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll. 注意:不论用这两种方式中的哪一种,最终部署时都需要matlab环境(MCR,在matlab安装路径下有). 1. 方式一:matlab直接打jar包 1.1. 利用matlab自带工具打jar包 1.1.1. 建立jar包 在matlab的Commond Window中输入d

Android热修复:Andfix和Hotfix,两种方案的比较与实现

Andfix和hotfix是两种android热修复框架. android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好.Hotfix框架算是对上文提到的QQ空间团队理论实现.本文旨在写实现方案,捎带原理. Andfix 引入 框架官网:https://github.com/alibaba/AndFix 介绍是用英文

状态与策略——审批操作的两种方案

审批操作是ERP或OA系统中必不可少的功能之一.这里介绍两种我设计的用于审批操作的方案,并借此就"状态模式"与"策略模式"提出一点自己的理解.    别问我为什么不使用工作流引擎等工具来实现审批功能.做第一版方案时,我孤陋寡闻得并不知道有这个东西.后来引入工作流框架会导致学习曲线骤然上扬,不太划算. 背景 背景无需过多介绍,不外乎有一些数据/任务/请求,需要由领导们点一下头或者按钮. 思路 由于孤陋寡闻,在得到需求之后,我第一反应不是"工作流",