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;interfaceuses SysUtils, ActiveX, msxml; function PrettyFormat(const AXML: String): String;implementationconst 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 ...
随机推荐
- PCIE体系结构
http://blog.sina.com.cn/s/articlelist_1685243084_3_1.html BAR寄存器 http://zhidao.baidu.com/link?url=rE ...
- cv:显示Linux命令运行进度
cv: 显示 cp.mv 等命令的进度 2014-07-14 By toy Posted in Apps Edit on GitHub 在 Linux 系统中 , 大多数命令从来都是信奉 “ 沉默是金 ...
- 以Crypto++实现RSA加解密二进制数据
网上一大片讲怎么加解密字符串的,找了大半天也没找到讲加解密二进制数据的,于是自己研究了下,分享给大家. 加解密函数: #include <rsa.h> #include <randp ...
- 【剑指offer】面试题37:两个链表的第一个公共结点
题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...
- 【POJ1338】Ugly Numbers(暴力打表)
打表大军是一股邪恶势力→_→ #include <iostream> #include <cstring> #include <cstdlib> #include ...
- 原生sql语句执行
public function Text() { $nation = D("Nation"); $sqla = "select * from nation"; ...
- VS2012/2013编辑器问题
1. Visual Studio 2013 'Could not evaluate Expression' Debugger Abnormality 解决办法:http://weblog.west-w ...
- Java并发实现一(并发的实现之Thread和Runnable的区别)
package com.subject01; public class ThreadOrRunnable { public static void main(String[] args) { Syst ...
- hdu 4055 Number String(dp)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- Windows下模拟Linux开发
1.背景 Linux环境下开发是大势所趋,也是开发者必须掌握的技能.然windows系统已深入人心,实在不想放弃windows下的成熟应用,因此可以在Windows上模拟一个Linux系统.这样就满足 ...