2012-07-13 44 views
6

Theo câu hỏi này:LINQ to XML bỏ qua ngắt dòng trong thuộc tính

Are line breaks in XML attribute values allowed?

ngắt dòng trong các thuộc tính XML được hoàn toàn hợp lệ (mặc dù có lẽ không khuyến khích):

<xmltag1> 
    <xmltag2 attrib="line 1 
line 2 
line 3"> 
    </xmltag2> 
</xmltag1> 

Khi tôi phân tích cú pháp XML như vậy bằng cách sử dụng LINQ to XML (System.Xml.Linq), các ngắt dòng đó được chuyển đổi âm thầm thành không gian ' ' ký tự.

Có cách nào để thông báo cho trình phân tích cú pháp XDocument.Load() để giữ lại các ngắt dòng đó không?

P.S .: XML tôi phân tích cú pháp được viết bởi phần mềm của bên thứ ba, vì vậy tôi không thể thay đổi cách viết ngắt dòng.

+0

Nếu bạn đang viết các thuộc tính theo chương trình, hãy xem bài viết này cho thấy các cách thoát khác nhau của chuỗi .http: //weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape- một XML-string-in-C.aspx lưu ý rằng không chỉ các dấu ngắt dòng phải được thoát. –

Trả lời

9

Nếu bạn muốn ngắt dòng trong giá trị thuộc tính cần được giữ nguyên thì bạn cần viết chúng với tham chiếu ký tự, ví dụ:

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/> 

như trình phân tích cú pháp XML khôn ngoan khác sẽ bình thường hóa chúng thành khoảng trắng, theo đặc tả XML http://www.w3.org/TR/xml/#AVNormalize.

[sửa] Nếu bạn muốn tránh bình thường giá trị thuộc tính sau đó tải XML với một di sản XmlTextReader giúp:

  string testXml = @"<foo bar=""Line 1. 
Line 2. 
Line 3.""/>"; 

      XDocument test; 
      using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml))) 
      { 
       xtr.Normalization = false; 
       test = XDocument.Load(xtr); 
      } 
      Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value); 

Đó kết quả đầu ra

|Line 1. 
Line 2. 
Line 3.| 
+0

Cảm ơn bạn, nhưng như tôi đã viết trong câu hỏi của tôi, XML được viết bởi một phần mềm của bên thứ ba, vì vậy tôi không thể thay đổi điều này. Có lẽ tôi cần một số loại thay thế RegEx để chuyển đổi ngắt dòng thành – cheeesus

+0

Tôi thấy ghi chú đó trong câu hỏi của bạn nhưng trong trường hợp này có một đặc điểm kỹ thuật rõ ràng và kết quả bạn nhận được tuân thủ đặc điểm kỹ thuật. Vì vậy, tôi đã viết câu trả lời đó để chỉ ra rằng hành vi bạn nhận được là đúng, ngay cả khi không muốn trong trường hợp của bạn. Tôi nghĩ rằng một di sản 'XmlTextReader' tuy nhiên sẽ cho phép bạn tránh các giá trị thuộc tính bình thường hóa, vì vậy tôi sẽ chỉnh sửa câu trả lời của tôi để hiển thị điều đó. –

+0

cảm ơn bạn! 'XmlTextReader' thực hiện công việc – cheeesus

0

ngắt dòng không gian khi phân tích cú pháp (không phải mã ASCII 32) nếu bạn bước qua từng chữ cái, bạn sẽ thấy rằng "không gian" "là mã ASCII 10 = LF (LineFeed) (!!) - do đó các dấu ngắt dòng vẫn có mặt nếu bạn cần thử thay thế chúng với mã ASCII 13 trong mã của bạn ... (hộp văn bản (Cửa sổ hình thức) không hiển thị LF như một linebreak)

+0

Cảm ơn bạn, tôi đã thử nghiệm trước đó, và tôi thực sự có hai mã ASCII 32 ký tự trong đó các ngắt dòng nên được. Tôi sẽ thử lại lần nữa để chắc chắn. – cheeesus

+1

Tôi đã thử nghiệm lại. Cả hai ký tự ''\ r'' và'' \ n'' trong thuộc tính XML được chuyển đổi thành '''' dấu cách (mã ASCII 32). – cheeesus

+0

đúng - điều đó áp dụng cho phần cdata - không thể tìm thấy cách hiện tại để bảo vệ các dấu ngắt dòng. là một reaplace của 32 32 LB tùy chọn cho bạn? – Cadburry

0

Theo MSDN:

Mặc dù vi xử lý XML duy trì tất cả các khoảng trắng trong nội dung phần tử, họ thường xuyên bình thường hóa nó trong các giá trị thuộc tính. Các tab, trả về vận chuyển và dấu cách được báo cáo là các dấu cách đơn. Trong một số loại thuộc tính nhất định, chúng cắt không gian màu trắng xuất hiện trước hoặc sau phần chính của giá trị và giảm khoảng trắng trong giá trị thành các dấu cách đơn. (Nếu một DTD có sẵn, cắt tỉa này sẽ được thực hiện trên tất cả các thuộc tính mà không phải là kiểu CDATA.)

Ví dụ, một tài liệu XML có thể chứa những điều sau đây:

báo cáo phân tích cú pháp
<whiteSpaceLoss note1="this is a note." note2="this 
is 
a 
note."> 

Một XML cả các giá trị thuộc tính là "this is a note.", chuyển đổi ngắt dòng thành các dấu cách đơn.

Tôi không thể tìm thấy bất kỳ điều gì về việc giữ gìn khoảng trắng của thuộc tính, nhưng tôi đoán có thể là không thể theo lời giải thích này.

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