2015-03-10 15 views
5

.NET XmlDocument có một hành vi thú vị khi các nút nội dung hỗn hợp in đẹp sử dụng XmlDocument.Save(TextWriter).Lý do đằng sau hành vi in ​​ấn của XmlDocument có nội dung hỗn hợp là gì?

Hành vi có thể được tóm tắt là "khi máy in đẹp gặp nút văn bản, nó vô hiệu hóa thụt đầu dòng và dòng mới tự động cho phần còn lại của cây con hiện tại".

Dưới đây là một ví dụ (http://ideone.com/b1WxD7):

<?xml version='1.0'?> 
<root><test><child1/><child2/>foo<child3><child4/></child3></test></root> 

được khá in để

<?xml version="1.0"?> 
<root> 
    <test> 
    <child1 /> 
    <child2 />foo<child3><child4 /></child3></test> 
</root> 

Hành vi này có vẻ không đúng cũng không trực quan. Tại sao XmlDocument hoạt động như thế?

+0

Bạn nên đề cập đến phương pháp bạn sử dụng để in đẹp. –

+0

Bài đăng có liên kết đến mã; Tôi sẽ làm rõ một chút. – zeuxcg

+0

* liên kết tới mã * sẽ không hoạt động. Nếu mã là một phần của câu hỏi, nó cần phải ở đây, trong chính câu hỏi đó, và không phải ở một vị trí bên ngoài trang web. –

Trả lời

3

Hành vi này là đáng tiếc, nhưng tôi nghĩ rằng nó có thể được giải thích bởi sự mô tả của các tùy chọn Formatting.Indented cho XmlTextWriter (đó là những gì XmlDocument.Save được sử dụng ở đây):

yếu tố nguyên nhân con được thụt vào theo đến các cài đặt IndentationIndentChar. Tùy chọn này chỉ thụt lề nội dung phần tử; nội dung hỗn hợp không bị ảnh hưởng.

Mục đích của tùy chọn này là để bảo tồn các định dạng của XML như

<p>Here is some <b>bold</b> text.</p> 

và không có nó định dạng lại như

<p> 
    Here is some 
    <b> 
     bold 
    </b> 
    text. 
</p> 

Nhưng có một vấn đề: Làm thế nào để XmlTextWriter biết một phần tử chứa nội dung hỗn hợp? Bởi vì XmlTextWriter là một nhà văn non-cached, forward-only, câu trả lời là nó không cho đến khi nó thực sự gặp dữ liệu ký tự. Tại thời điểm đó, nó chuyển sang chế độ "nội dung hỗn hợp" và ngăn chặn định dạng. Rất tiếc, đã quá muộn để hoàn tác định dạng của các nút con đã được ghi vào luồng cơ bản.

+0

Ah, phải - Tôi đã bỏ lỡ phần "chỉ chuyển tiếp" và đã tự hỏi tại sao nó không thể quét các trẻ em để kiểm tra xem nội dung có được trộn hay không. Cảm ơn! – zeuxcg

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