用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>我希望在保存的文件中也是格式化的【有缩进的】,如何办?谢谢!
<?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>我希望在保存的文件中也是格式化的【有缩进的】,如何办?谢谢!
XML文档不是用来显示的,数据相同就可以了
格不格式化一样的
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、給君圧縮後発送)
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;implementationprocedure 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.