2011-12-22 26 views
6

Tôi đang sử dụng XDocument trong LINQ để chỉnh sửa (chèn) và lưu tài liệu xml.xdocument lưu giữ khoảng trắng bên trong thẻ

XDocument doc = XDocument.Load("c:\\sample.xml", LoadOptions.PreserveWhitespace); 
doc.Save("c:\\sample.xml",SaveOptions.DisableFormatting) 

sample.xml trước doc.Save:

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2" > 
    value 
</ELEMENT> 

sample.xml sau doc.Save

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2"> 
    value 
</ELEMENT> 

Như bạn có thể thấy, có không gian gấp đôi sau ATTRIB1 và ​​một đơn không gian sau ATTRIB2 trong tài liệu gốc. Nhưng những không gian này đã bị loại bỏ bởi LINQ khi tôi gọi doc.save.

Làm cách nào để giữ khoảng trắng trong thẻ?

+1

tại sao bạn lại yêu cầu điều đó? – ChrisWue

+7

Đó là yêu cầu ...... – Rocky

Trả lời

11

Tôi tin rằng LoadOptions.PreserveWhitespaceSaveOptions.DisableFormatting chỉ hướng dẫn XDocument về cách xử lý khoảng trắng về thụt đầu dòng và nội dung của các nút văn bản. Nó sẽ vẫn bình thường hóa các thuộc tính, v.v.

Bạn có thể sử dụng quá tải nơi bạn chỉ định XmlWriter được cấu hình để làm những gì bạn muốn và nếu bạn không thể tìm thấy cấu hình hoạt động với XmlTextWriter mặc định, bạn luôn có thể tạo XmlWriter của riêng bạn.

1

Đây là "khoảng trắng không đáng kể" và bị xóa tại thời điểm đọc XML. Vào thời điểm bạn gọi lưu, không có thông tin về khoảng cách giữa các thuộc tính. (Lưu ý rằng nói đúng thứ tự các thuộc tính có thể không được biết đến vì nó không có ý nghĩa trong XML).

Nếu bạn muốn đọc/ghi XML theo cách không được hỗ trợ trực tiếp bởi tiêu chuẩn XML, bạn cần cung cấp một số xử lý tùy chỉnh. Tùy thuộc vào yêu cầu XmlWriter tùy chỉnh có thể là đủ (tức là nếu bạn muốn các thuộc tính riêng biệt thống nhất với 2 khoảng trắng) hoặc bạn sẽ cần tự xây dựng toàn bộ stack (độc giả/nhà văn/nút) nếu bạn muốn thực sự bảo toàn thông tin từ XML gốc dưới dạng văn bản, chứ không phải XML).

+0

Điều đó có vẻ không chính xác. Tôi tin rằng nó được định dạng lại trong quá trình lưu, chứ không phải đọc. Và ngay cả khi điều đó là đúng, thì tài liệu theo nghĩa đen là nằm; bạn sẽ thấy tài liệu cho 'LoadOptions.PreserveWhitespace' lần đọc" Bảo toàn không gian trắng không đáng kể trong khi phân tích cú pháp. " và tài liệu cho 'SaveOptions.DisableFormatting' lần đọc" Bảo toàn tất cả không gian trắng không đáng kể trong khi tuần tự hóa. ". – BrainSlugs83

+0

Ngoài ra nhận xét về XML này không được hỗ trợ bởi tiêu chuẩn là không đúng chỗ, nếu nó không được hỗ trợ bởi tiêu chuẩn, nó sẽ không hợp lệ XML, và một ngoại lệ sẽ được ném vào thời gian phân tích cú pháp. – BrainSlugs83

+0

@ BrainSlugs83 - Lưu ý rằng từ điểm XML xem khoảng trống quan trọng/không đáng kể chỉ được xem xét bên trong nội dung của phần tử (không phải trong thẻ bắt đầu mà thuộc tính) - vì vậy 2 khoảng cách giữa các thuộc tính không được coi là "khoảng trắng" mà đúng hơn là dấu phân tách cú pháp . Vì vậy, tôi không chắc chắn tại sao bạn nghĩ rằng "PreserveWhitespace' nên có tác động vào cách không gian giữa các thuộc tính được xử lý. Xem http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-space để có định nghĩa chính thức hơn. –

Các vấn đề liên quan