用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>我希望在保存的文件中也是格式化的【有缩进的】,如何办?谢谢!

解决方案 »

  1.   

    Delphi自己的组件是不得的
    XML文档不是用来显示的,数据相同就可以了
    格不格式化一样的
      

  2.   

    这个道理我也明白,但是delphi下这个问题就搞不定么?连jdom都能办到的,txmldocument会不行?
      

  3.   

    TXmlDocment的属性,Options 中有个子属性,打开就行了。
      

  4.   

    unit XmlEditForm;interfaceuses
      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、給君圧縮後発送)
      

  5.   

    我看了一下源代码,上面的程序好像是要手工编辑格式的我自己已经解决这个问题了unit Comm;interfaceuses
      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.