2010-01-05 48 views
48

Tôi cần lưu nội dung chứa các dòng mới vào một số thuộc tính XML, chứ không phải văn bản. Phương pháp này nên được chọn để tôi có thể giải mã nó trong XSLT 1.0/ESXLT/XSLT 2.0Làm thế nào để lưu các dòng mới trong thuộc tính XML?

Phương pháp mã hóa tốt nhất là gì?

Vui lòng đề xuất/đưa ra một số ý tưởng.

+0

trùng lặp có thể xảy ra [Are ngắt dòng trong thuộc tính XML giá trị hợp lệ?] (Http: // stackoverflow. com/questions/449627/are-line-break-in-xml-attribute-values-valid) –

+0

đã tạo một ví dụ cho một câu hỏi tương tự: http://stackoverflow.com/a/29782321/611007 – n611x007

+0

related: https://stackoverflow.com/questions/260436/ - liên quan: https://stackoverflow.com/questions/449627/ - liên quan: https://stackoverflow.com/questions/1289524/ – n611x007

Trả lời

64

Trong API DOM tuân thủ, bạn không cần phải làm gì. Chỉ cần lưu các ký tự dòng mới thực tế vào thuộc tính, API sẽ tự mã hóa chính xác chúng (xem Canonical XML spec, section 5.2).

Nếu bạn làm mã hóa riêng của bạn (ví dụ: thay thế \n với 
 trước khi lưu giá trị thuộc tính), API sẽ mã hóa đầu vào của bạn lại, dẫn đến 
 trong file XML.

Dòng dưới cùng là giá trị chuỗi được lưu nguyên văn. Bạn nhận ra những gì bạn đưa vào, không cần can thiệp.

Tuy nhiên… một số triển khai không tuân thủ. Ví dụ: họ sẽ mã hóa & ký tự trong giá trị thuộc tính, nhưng hãy quên các ký tự hoặc tab mới. Điều này đặt bạn vào một vị trí thua vì bạn không thể thay thế các dòng mới bằng 
 trước đó.

Những triển khai sẽ tiết kiệm ký tự newline unencoded, như thế này:

<xml attribute="line 1 
line 2" /> 

Sau khi phân tích một tài liệu như vậy, newlines chữ trong các thuộc tính được chuẩn hóa thành một không gian duy nhất (một lần nữa, phù hợp với spec) - và do đó họ bị lạc.

Lưu (và giữ lại!) Dòng mới trong thuộc tính là không thể trong các triển khai này.

+0

Điều tôi đã gặp phải: XML sử dụng các dòng mới kiểu Unix (LF). Vì vậy, nếu bạn muốn lưu trữ dòng mới kiểu Windows (CR + LF), bạn sẽ cần phải chuyển đổi các dòng mới sau khi đọc từ thuộc tính của bạn, hoặc thoát khỏi các dòng mới bằng cách nào đó. Nguồn: http://www.w3schools.com/xml/xml_syntax.asp – Joe

+2

@Joe: Bạn lấy thông tin từ XML ở đâu sử dụng dòng mới kiểu Unix? Theo như tôi thấy, [spec] (http://www.w3.org/TR/xml/) không hạn chế điều đó. – Tomalak

+0

@Tomalak Cuộn xuống cuối liên kết đó. Tìm tiêu đề "XML Stores New Line as LF". Tôi nhận thấy điều này trong thực tế quá - cả XmlWriter trong C# và trong một thành phần bên thứ 3 loại bỏ các ký tự CR (chỉ để lại LF, như Unix). – Joe

37

Bạn có thể sử dụng đối tượng &#10; để đại diện cho dòng mới trong thuộc tính XML. &#13; có thể được sử dụng để đại diện cho một vận chuyển trở lại. Kiểu CRLF kiểu cửa sổ có thể được biểu diễn là &#13;&#10;.

Đây là cú pháp XML hợp pháp. Xem XML spec để biết thêm chi tiết.

+0

Đây có phải là ký tự XML hợp lệ không ?? –

+0

Tôi đoán tôi phải sử dụng một số mã hóa thay vì thực thể Vì getAttribute sẽ không hoạt động với một chuỗi có chứa dòng mới. Bạn có nhiều ý tưởng? Thực thể sẽ giải quyết vấn đề getAttribute? – Tommy

+0

@Chathuranga Chandrasekara: Có. Đó là XML hợp lệ. Tôi đã cập nhật câu trả lời của mình để bao gồm một liên kết đến thông số XML nơi các biểu tượng này được đề cập đến. – Asaph

0

Một câu trả lời thô có thể là:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(@"Agenda.xml"); 
//make stuff with the xml 
//make attributes value = "\r\n" (you need both expressions to make a new line) 
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r \n<"); 
StreamWriter sDoc = new StreamWriter(@"Agenda.xml"); 
sDoc.Write(a); 
sDoc.Flush(); 
sDoc.Dispose(); 

chí này như bạn thấy chỉ là một chuỗi

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