2012-04-18 36 views
7

Tôi có tệp XML, được định dạng ban đầu bằng cách sử dụng dấu cách không gian (2 dấu cách cho mỗi mục lồng nhau).IXMLDocument.SaveToFile() sử dụng ký tự tab cho thụt đầu dòng thay vì dấu cách

Khi tôi tải và lưu tệp này bằng cách sử dụng IXMLDocument, khoảng trống không gian đang thay đổi thành các ký tự tab (mã số 9).

Đây là mã:

var 
    FileName: String; 
    Document: IXMLDocument; 
... 
Document := XMLDoc.LoadXMLDocument(FileName); 
Document.SaveToFile(FileName); 

Tôi cố gắng để sử dụng NodeIndentStr tài sản - không có kết quả:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.NodeIndentStr := ' '; 
Document.SaveToFile(FileName); 

Dùng FormatXMLData quá - không có kết quả:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.XML.Text := XMLDoc.FormatXMLData(Document.XML.Text); 
Document.Active := True; 
Document.SaveToFile(FileName); 

Làm thế nào tôi có thể tiết kiệm với không gian thụt lề thay vì ký tự tab?

+1

Bạn có thể muốn đọc bài viết này bằng cách Žarko Gajic, [delphi-format-xml-nút-indent] (http://delphi.about.com/od/delphitips2009 /qt/delphi-format-xml-node-indent.htm). Giải pháp được cung cấp sử dụng 'xmlDoc.FormatXMLData' để định dạng tệp theo cách tốt đẹp. –

+0

@LURD đã thử - không có kết quả: ( – Andrew

+0

Tôi thấy vấn đề nằm ở đâu bây giờ, 'FormatXMLData' không có cơ hội để biết' NodeIndentStr' nào bạn đang sử dụng vì bạn đang chuyển chuỗi tới hàm đó, do đó nó sử dụng TAB mặc định char – TLama

Trả lời

11

Có một tùy chọn trong IXMLDocument nơi trình phân tích cú pháp có thể được thông báo để giữ khoảng trắng.

Sử dụng nó như thế này:

Document.ParseOptions := 
    Document.ParseOptions+[poValidateOnParse]+[poPreserveWhiteSpace]; 

Disclaimer: Tôi đã không thử nó.

+0

+1. Tôi đang trên D5 bây giờ, và không thể kiểm tra nó với các phiên bản mới hơn của Delphi, nhưng nếu 'IXMLDocument' là một trình bao bọc xung quanh' IXMLDOMDocument' thì nó sẽ hoạt động (được thử nghiệm với 'IXMLDOMDocument'). – kobik

+1

vâng, nó hoạt động. Cảm ơn bạn. Lưu ý: 'ParseOptions' nên được đặt trước' LoadFromFile() ' – Andrew

+0

+1 từ tôi nữa. Điều này làm các trick. Có lẽ sẽ tốt nếu bạn không cần sử dụng tùy chọn 'NodeIndentStr' cũng không' doNodeAutoIndent' vì bạn đang chuyển chuỗi tới hàm 'FormatXMLData' (không phải tài liệu), do đó nó có các thiết lập riêng. Và bạn có thể xóa cờ 'poValidateOnParse' ;-) – TLama

0

Tôi không chắc chắn điều gì khác biệt nhưng Tài liệu.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace]; không thể truy cập được đối với tôi.

Something tương tự làm việc:

var 
    xmlDoc: IXMLDOMDocument2; 

xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument2; 
xmlDoc.validateOnParse := True; 
xmlDoc.preserveWhiteSpace := True; 
Các vấn đề liên quan