xml格式化问题

sunmingdong 2004-04-16 10:21:54
用TXMLDocument,

(1)先loadFromFile,得到
<?xml version='1.0' encoding='utf-8'?>
<root>
<a att1=''>
<b/>
</a>
</root>

(2)之后我用CreateNode('c');生成的save后就成这样了

<?xml version='1.0' encoding='utf-8'?>
<root>
<a att1=''>
<b/>
</a>
<c><d>...</d><d>...</d><d>...</d></c>
</root>

我希望在保存的文件中也是格式化的【有缩进的】,如何办?谢谢!
...全文
468 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunmingdong 2004-05-08
  • 打赏
  • 举报
回复
我看了一下源代码,上面的程序好像是要手工编辑格式的

我自己已经解决这个问题了

unit Comm;

interface

uses
MSXML,XMLDOM,SysUtils,ComCtrls,Winsock,Dialogs,ComObj;

procedure saveXMLWithFormat(doc,fileName:string);
function formatXMLNode(element:IXMLDOMNode;indent:integer):String;
function formatXMLDoc(doc:IXMLDOMDocument;indent:integer):String;

implementation

procedure saveXMLWithFormat(doc:String;fileName:string);
var
saveXMLDOM:IXMLDOMDocument;
begin
saveXMLDOM:=CreateOleObject('MSXML.DOMDocument') as IXMLDOMDocument;
saveXMLDom.loadXML(doc);
saveXMLDOM.loadXML(formatXMLDoc(saveXMLDOM,1));
saveXMLDOM.save(fileName);
end;

function formatXMLDoc(doc:IXMLDOMDocument;indent:integer):String;
var
sRes:string;
i:integer;
begin
sRes:='';
for i:=0 to doc.childNodes.length-1 do
begin
sRes:=sRes+formatXMLNode(doc.childNodes.item[i],indent);
end;
result:='<?xml version="1.0" encoding="gb2312"?>'+sRes;
end;

function formatXMLNode(element:IXMLDOMNode;indent:integer):String;
var
sBlank,sRes:string;
i:integer;
begin
sBlank:='';
for i:=0 to indent do
sBlank:=sBlank+' ';
if (element.nodeType=ELEMENT_NODE) and (element.hasChildNodes)
and (element.childNodes.item[0].nodetype<>TEXT_NODE) then
begin
sRes:=sBlank+'<'+element.NodeName;
for i:=0 to element.attributes.length-1 do
sRes:=sRes+' '+element.attributes.item[i].nodeName
+'="'+element.attributes.item[i].text+'"';
sRes:=sRes+'>'+#13;
indent:=indent+1;
for i:=0 to element.childNodes.length-1 do
sRes:=sRes+formatXMLNode(element.childNodes.item[i],indent);
sRes:=sRes+sBlank+'</'+element.NodeName+'>';
end
else if element.NodeType<>PROCESSING_INSTRUCTION_NODE then
sRes:=sRes+sBlank+element.XML+#13;
result:=sRes;
end;

end.
ailibuli 2004-04-26
  • 打赏
  • 举报
回复
unit XmlEditForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, ComCtrls, ToolWin, OleCtrls,
SHDocVw;

type
TFormXmlEdit = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
MemoXml: TMemo;
ToolBar1: TToolBar;
btnLoad: TToolButton;
TabSheet5: TTabSheet;
EditXmlFile: TEdit;
Label1: TLabel;
btnSave: TToolButton;
xmlBar: TStatusBar;
Label4: TLabel;
EditFolder: TEdit;
Label5: TLabel;
EditBaseFile: TEdit;
btnUpdate: TButton;
cbAutoUpdate: TCheckBox;
TabSheet7: TTabSheet;
XmlBrowser: TWebBrowser;
XMLDoc: TXMLDocument;
ToolButton1: TToolButton;
procedure btnLoadClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure MemoXmlChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnUpdateClick(Sender: TObject);
procedure EditFolderOrFileChange(Sender: TObject);
procedure TabSheet7Enter(Sender: TObject);
procedure MemoXmlKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure MemoXmlMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormXmlEdit: TFormXmlEdit;

implementation

{$R *.DFM}

procedure TFormXmlEdit.btnLoadClick(Sender: TObject);
begin
// try to load the file
MemoXml.Lines.LoadFromFile (EditXmlFile.Text);
end;

procedure TFormXmlEdit.btnSaveClick(Sender: TObject);
begin
// save the file
MemoXml.Lines.SaveToFile (EditXmlFile.Text);
end;

procedure TFormXmlEdit.MemoXmlChange(Sender: TObject);
var
eParse: IDOMParseError;
begin
XmlDoc.Active := True;
xmlBar.Panels[1].Text := 'OK';
xmlBar.Panels[2].Text := '';
(XmlDoc as IXMLDocumentAccess).DOMPersist.loadxml(MemoXml.Text);
eParse := (XmlDoc.DOMDocument as IDOMParseError);
if eParse.errorCode <> 0 then
with eParse do
begin
xmlBar.Panels[1].Text := 'Error: ' + IntToStr (Line) +
'.' + IntToStr (LinePos);
xmlBar.Panels[2].Text := SrcText + ': ' + Reason;
end;
end;

procedure TFormXmlEdit.FormCreate(Sender: TObject);
begin
EditFolder.Text := ExtractFilePath (Application.ExeName);
btnUpdateClick (self);
end;

procedure TFormXmlEdit.btnUpdateClick(Sender: TObject);
begin
EditXmlFile.Text := EditFolder.Text +
EditBaseFile.Text + '.xml';
end;

procedure TFormXmlEdit.EditFolderOrFileChange(Sender: TObject);
begin
if cbAutoUpdate.Checked then
btnUpdateClick (self);
end;

procedure TFormXmlEdit.TabSheet7Enter(Sender: TObject);
begin
XmlBrowser.Navigate (EditXmlFile.Text);
end;

procedure TFormXmlEdit.MemoXmlKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
xmlBar.Panels[0].Text :=
'位置: ' + IntToStr (MemoXml.CaretPos.Y + 1) +
'.' + IntToStr (MemoXml.CaretPos.X + 1);
end;

procedure TFormXmlEdit.MemoXmlMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
xmlBar.Panels[0].Text :=
'位置: ' + IntToStr (MemoXml.CaretPos.Y + 1) +
'.' + IntToStr (MemoXml.CaretPos.X + 1);
end;

end.

(注:此為一個Demo、若無法執行、告俺eMail、給君圧縮後発送)
sunmingdong 2004-04-19
  • 打赏
  • 举报
回复
行么?我试过,不起作用
qinmaofan 2004-04-17
  • 打赏
  • 举报
回复
TXmlDocment的属性,Options 中有个子属性,打开就行了。
sunmingdong 2004-04-16
  • 打赏
  • 举报
回复
这个道理我也明白,但是delphi下这个问题就搞不定么?

连jdom都能办到的,txmldocument会不行?
ly_liuyang 2004-04-16
  • 打赏
  • 举报
回复
Delphi自己的组件是不得的
XML文档不是用来显示的,数据相同就可以了
格不格式化一样的
sunmingdong 2004-04-16
  • 打赏
  • 举报
回复
自己up一下,希望高手看到

5,388

社区成员

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

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