2010-10-03 21 views
4

我正在使用Delphi7 ClientDataSet爲我的一些數據讀取和寫入xml文件。使用Delphi7 TClientDataSet:是否可以讓它將XML內容保存爲縮進格式

Howerver,當我想在程序外部瀏覽這個程序時(雙擊Windows資源管理器中的xml),我得到'在文本內容中找到了無效字符。處理資源時出錯' - 儘管數據在Delphi中讀取和寫入都很好。

有沒有辦法強制TClientDataSet以縮進的方式將其內容寫入一行?

這樣我可以很容易地將它打開到文本編輯器中,並找出哪個字符會觸發上述錯誤。

無論如何:我發現用CR/LF和縮進書寫XML文件要清楚得多。

Thx提前。

+0

-1。目前還不清楚縮進XML如何解決無效字符問題。請說明你想解決什麼問題。如果您有兩個問題,請發佈*兩個*問題。 – 2010-10-03 19:10:16

+0

@Rob Kennedy:你有沒有試過用文本編輯器編輯一個xml文件,其中整個文件在一行?如果文件縮進,並且因此使用cr/lf作爲行分隔符,則可以輕鬆地將其加載到編輯器中,並且至少以可視方式查看文件以查找罪魁禍首字符(或多個字符)。你在哪裏看到兩個問題?我問是否可以強制TClientDataset寫一個縮進的xml格式的文件。錯誤是澄清爲什麼我需要這個。問題的標題說是我問,不是嗎?這裏-1是不需要的。 – Edelcom 2010-10-04 06:13:42

+0

我不得不同意Rob在這裏,因爲幾乎所有的開發環境都可以選擇自動格式化XML代碼。即使你不這樣做,也有很多網站可以幫助你設計你的代碼。在Delphi中調整一個非常常見的數據庫組件是爲了完成某些不適合做的事情,這對您的情況有點過分。目前還不清楚您是否想要修正錯誤,或者是否希望將客戶數據集保存爲縮進XML。 – 2013-09-09 04:31:47

回答

4

這是因爲正確的編碼(如<?xml version="1.0" encoding="UTF-8"?>)沒有在您的輸出文件中指定,但它包含一些不兼容的編碼字符。

由於RRUZ mentioned,指定明確的書面文件肯定會解決「無效字符」錯誤的時候,因爲它會寫編碼標記第一TDataPacketFormatdfXMLUTF8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0">[...]
您也可以手動添加編碼的已存在文件的文件的開始。

至於可讀格式,一些讀者可以閱讀原始的單行和爲貴(瀏覽器如Firefox或Internet Explorer的,和XML編輯器,如XMLNotePad

7

當您使用TCustomClientDataSet.SaveToFile過程時,可以選擇輸出格式,默認情況下,該值設置爲dfBinary,以二進制格式對數據進行編碼。

procedure TCustomClientDataSet.SaveToFile(const FileName: string = ''; 
    Format: TDataPacketFormat = dfBinary); 

嘗試改變Format參數dfXMLdfXMLUTF8

ClientDataSet1.SaveToFile('file.xml',dfXML); 

,如果你想格式化您可以使用FormatXMLData功能的XML輸出試試這個代碼

uses 
XMLDoc; 

Procedure FormatXMLFile(XmlFile:string); 
var 
    oXml : TXMLDocument; 
begin 
    oXml := TXMLDocument.Create(nil); 
    try 
    oXml.LoadFromFile(XmlFile); 
    oXml.XML.Text:=xmlDoc.FormatXMLData(oXml.XML.Text); 
    oXml.Active := true; 
    oXml.SaveToFile(XmlFile); 
    finally 
    oXml := nil; 
    end; 
end; 

最後你的代碼會看起來像這樣

ClientDataSet1.SaveToFile('test.xml',dfXML); 
FormatXMLFile('test.xml'); 
+2

請注意,如果數據包含'François'中的字符'çé...',則保存爲'dfXML'是不夠的,需要'dfXMLUTF8'。 – 2010-10-03 18:32:16

0

我修改你的代碼,因爲我做的格式對於UTF-8有一些問題:

Procedure FormatXMLFile(XmlFile:string); 
var 
    oXml : TXMLDocument; 
    s : utf8String; 
begin 
    oXml := TXMLDocument.Create(nil); 
    try 
    oXml.LoadFromFile(XmlFile); 
    s := oxml.XML.Text; 
    s := StringReplace(s, '><', '>' + #13#10 + '<' , [rfReplaceAll]); 
    //oXml.XML.Text:=xmlDoc.FormatXMLData(oxml.XML.Text); 
    oxml.XML.Text := s; 
    oXml.Active := true; 
    oXml.SaveToFile(XmlFile); 
    finally 
    oXml := nil; 
    end; 
end; 
相關問題