XML换行缩进问题

kampan 2008-11-28 10:16:54
如下函数,实现用Delphi创建和添加XML的过程,但所得的XML用记事本或UltraEdit打开没有换行和缩进,直接在IE打开则有缩进和换行,虽不影响实际的调用读取,但若要直接用记事本打开修改,则很不方便,哪位知道怎样处理可以实现换行和缩进,或有示例代码,望不吝赐教,谢谢先!
(注:我用的是IXMLDOMDocument 而不是TXMLDocument,所以不要告诉我设置doNodeAutoIndent为True方式)

type
TXMLOption=class
private
FActive :boolean;
FFilename: string;
FXMLDoc :IXMLDOMDocument;
//填加一个子节点
procedure AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
public
procedure CreateBlank(Filename: string);
procedure OpenXml(Filename: string);
procedure CloseXml;
procedure AppendProtocol(newptl: RecProtocol);
end;

implementation

const
XMLTag = 'xml';
XMLPrologAttrs = 'version="1.0" encoding="UTF-8"';
XMLComment = '主站规约库';

ProtocolTag = 'protocol_list';
ItemTag = 'protocol';
XMLComment2 = '创建文档时间:';
XML_TypeId = 'typeid';
XML_Id = 'id';
XML_Name = 'name';
XML_CtrlCode = 'ctrlcode';
XML_FunCode = 'funcode';
XML_DataLength = 'datalength';
XML_DataFormat = 'dataformat';
XML_Unit = 'unit';
XML_InitValue = 'initvalue';
XML_RwFlag = 'rwflag';
XML_LPwd = 'lpwd';
XML_HPwd = 'hpwd';
XML_Help = 'help';

//创建一个空XML,如果这个Filename文件已经存在,则覆盖
procedure TXMLOption.CreateBlank(Filename: string);
begin
FActive:=false;
FFilename:='';
try
FXMLDoc := CoDOMDocument.Create;
FXMLDoc.AppendChild(FXMLDoc.CreateProcessingInstruction(XMLTag, XMLPrologAttrs)); //表头
FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment)); //文档说明
FXMLDoc.AppendChild(FXMLDoc.CreateElement(ProtocolTag)); //元素
FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment2+datetimetostr(now))); //文档结尾
FXMLDoc.save(Filename);
FFilename:=Filename;
FActive:=true;
except
FXMLDoc:=nil;
end;
end;
//打开一个存在的Filename XML文档
procedure TXMLOption.OpenXml(Filename: string);
begin
if not Assigned(FXMLDoc) then
begin
FXMLDoc := CoDOMDocument.Create;
if FXMLDoc.Load(Filename) then FActive:=true
else FActive:=false;
if FActive then FFilename:=Filename
else FFilename:='';
end;
end;
//关闭一个打开的XML文档
procedure TXMLOption.CloseXml;
begin
if Assigned(FXMLDoc) then FXMLDoc:=nil;
FFilename:='';
FActive:=false;
end;
procedure TXMLOption.AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
var
Internal: IXMLDOMElement;
begin
Internal:=IXMLDOMElement(Parent.AppendChild(FXMLDoc.CreateElement(Field)));
Internal.AppendChild(FXMLDoc.CreateTextNode(Value));
end;
//填加一个节点到后面
procedure TXMLOption.AppendProtocol(newptl: RecProtocol);
var
xnode:IXMLDOMElement;
xroot:IXMLDOMElement;
begin
if FActive then
begin
xroot:=FXMLDoc.documentElement;
xnode :=IXMLDOMElement(xroot.AppendChild(FXMLDoc.CreateElement(ItemTag)));
xnode.setAttribute(XML_TypeId, newptl.P_TypeId);
AddSimpleElement(xnode, XML_Id, newptl.P_Id);
AddSimpleElement(xnode, XML_Name, newptl.P_Name);
AddSimpleElement(xnode, XML_CtrlCode, newptl.P_CtrlCode);
AddSimpleElement(xnode, XML_FunCode, newptl.P_FunCode);
AddSimpleElement(xnode, XML_DataLength, newptl.P_DataLength);
AddSimpleElement(xnode, XML_DataFormat, newptl.P_DataFormat);
AddSimpleElement(xnode, XML_Unit, newptl.P_Unit);
AddSimpleElement(xnode, XML_InitValue, newptl.P_InitValue);
AddSimpleElement(xnode, XML_RwFlag, newptl.P_RwFlag);
AddSimpleElement(xnode, XML_LPwd, newptl.P_LPwd);
AddSimpleElement(xnode, XML_HPwd, newptl.P_HPwd);
AddSimpleElement(xnode, XML_Help, newptl.P_Help);
FXMLDoc.save(FFilename);
end;
end;
...全文
439 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
panrongzeng 2008-11-28
  • 打赏
  • 举报
回复
我一般是用ie打开,然后查看其源代码,不过我试了好像跟文本打开差不多。
kampan 2008-11-28
  • 打赏
  • 举报
回复
俺滴问题咋没人回答泥?
其实,生成的XML文件直接运行,是有格式的,但就是用记事本打开看太乱!
kampan 2008-11-28
  • 打赏
  • 举报
回复
已经调试成功!记事本打开显示可能是Tab为8的原因,缩进有点大,用UltraEdit打开效果非常不错!多谢同为尤文粉丝的budded,分都是你的!
kampan 2008-11-28
  • 打赏
  • 举报
回复
十分感谢budded ,不过我直接拿过来用没出现我所希望的效果,我再调试调试看看。
还是没分开

<?xml version="1.0" encoding="UTF-8"?>
<!--主站规约库-->
<protocol_list><protocol typeid="101"><id>111</id><name>11</name><ctrlcode>1</ctrlcode><funcode>1</funcode><datalength>1</datalength><dataformat>1</dataformat><unit>1</unit><initvalue>1</initvalue><rwflag>RW</rwflag><lpwd>1</lpwd><hpwd>1</hpwd><help>1</help></protocol></protocol_list>
<!--创建文档时间:2008-11-28 13:47:30-->
budded 2008-11-28
  • 打赏
  • 举报
回复
分数都是我的了
procedure PrettyFormat(const AXMLDoc: 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
TraverseNode(AXMLDoc.documentElement, '');
end;

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧