TXMLDocument换行的两种方案
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 . |
使用实例:
1
|
Memo2 . Text := PrettyFormat( '<root><budded/><who/></root>' ); |
1
2
3
4
|
< root > < budded /> < who /> </ root > |
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
TXMLDocument换行的两种方案的更多相关文章
- 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
http://www.jb51.net/article/70415.htm 含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...
- Linux下实现秒级定时任务的两种方案
Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command s ...
- [转载]Java操作Excel文件的两种方案
微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...
- .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
一.前言 上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案,另外如果没看我上篇博客的人最好看一下,否则你可能看的云里雾里的,这里我就不进行具体的方案 ...
- 比较好用的移动端适配的两种方案及flexible和px2rem-loader在webpack下的配置
移动端适配,目前自己常用的两种 方案,参考以下两篇好文 方案一:使用lib-flexible包 https://www.w3cplus.com/mobile/lib-flexible-for-html ...
- Spring Boot 配置文件密码加密两种方案
Spring Boot 配置文件密码加密两种方案 jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项 ...
- Git--gitLab远程仓库分支代码回退的两种方案
事由:作为仓库的master,一时老眼昏花,把同事说的不合并看成了合并,直接合并了. 解决方法: 一.粗鲁的代码回退--直接在远程仓库合并 1. 在gitLab远程仓库中,基于想回退的代码的节点(co ...
- kettle 多表全删全插同步数据 两种方案
背景: 接到上级指示,要从外网某库把数据全部导入到内网,数据每天更新一次即可,大约几百万条数据,两个库结构一样,mysql的,两台数据库所在服务器都是windows server的,写个java接口实 ...
- 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...
随机推荐
- 为什么memset的第二个参数不把int替换成char
memset是一个经常被用来初始化数组的函数,其定义如下: 1 void * memset ( void * ptr, int value, size_t num ); 它的效果大致是把以ptr为起始 ...
- windows系统各版本 各种数据结构
极爽啊http://msdn.moonsols.com/
- NOI2013 UOJ122 向量内积
神题...... 还是大神讲得比较清晰~orz http://dffxtz.logdown.com/posts/197950-noi2013-vector-inner-product 启发题:poj3 ...
- shell惊鸿
显示当前用户uid
- Maven--生命周期和插件(四)
<Maven--搭建开发环境(一)> <Maven--构建企业级仓库(二)> <Maven—几个需要补充的问题(三)> <Maven—生命周期和插件(四)&g ...
- 【转】YUV格式&像素
一幅彩色图像的基本要素是什么? 说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少.一幅1920x1080像素的YUV422的图像,大小是1920X1080X2=4147 ...
- Spring 的优秀工具类盘点第 1 部分
文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...
- poj 2112 Optimal Milking (二分图匹配的多重匹配)
Description FJ has moved his K ( <= K <= ) milking machines <= C <= ) cows. A ..K; the c ...
- each,map,grep的区别
var arr = ["aa","bb","{name:apple}"]; 1.each的使用 var a = $.each(arr,fun ...
- hdu-1573 Robot Motion
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10219 Accepted: 4977 Des ...