2009-09-09 12 views
28

Tôi đang sử dụng XML để chia sẻ nội dung HTML. AFAIK, tôi có thể nhúng HTML bằng cách:Html bên trong XML. Tôi có nên sử dụng CDATA hoặc mã hóa HTML

  • Mã hóa: Tôi không biết nếu nó hoàn toàn an toàn để sử dụng. Và tôi sẽ phải giải mã nó một lần nữa.

  • Sử dụng các phần CDATA: Tôi vẫn có thể gặp sự cố nếu nội dung chứa thẻ đóng "]]>" và một số ký tự thập lục phân nhất định, tôi tin. Mặt khác, trình phân tích cú pháp XML sẽ trích xuất thông tin một cách minh bạch cho tôi.

Tôi nên chọn tùy chọn nào?

CẬP NHẬT: Xml sẽ được tạo bằng java và được chuyển thành chuỗi thành dịch vụ web .net, nó sẽ được phân tích cú pháp trở lại. Do đó, tôi cần có khả năng xuất xml dưới dạng chuỗi và tải nó bằng cách sử dụng "doc.LoadXml (xmlString);"

Trả lời

24

Hai tùy chọn gần như giống hệt nhau. Dưới đây là hai lựa chọn của bạn:

<html>This is &lt;b&gt;bold&lt;/b&gt;</html> 

<html><![CDATA[This is <b>bold</b>]]></html> 

Trong cả hai trường hợp, bạn phải kiểm tra chuỗi ký tự đặc biệt để thoát. Rất nhiều người giả vờ rằng các chuỗi CDATA không cần bất kỳ sự thoát nào, nhưng khi bạn chỉ ra, bạn phải đảm bảo rằng "]]>" không trượt trong chế độ không thoát.

Trong cả hai trường hợp, bộ xử lý XML sẽ trả về chuỗi của bạn cho bạn được giải mã.

+1

Lý do tôi chọn không sử dụng CDATA, thường là phần lớn dữ liệu không yêu cầu thoát, và đó là một mớ hỗn độn để xem nhiều trình bao bọc CDATA trên văn bản không cần thoát.Phương pháp đầu tiên có nghĩa là đôi khi bạn có mã hóa HTML, nhưng phần lớn thời gian bạn có văn bản rõ ràng đẹp không có trình bao bọc không cần thiết. Tất nhiên điều này có thể khác nhau tùy thuộc vào dữ liệu điển hình của bạn. – AaronLS

0

Mã hóa nó sẽ hoạt động tốt và đáng tin cậy. Bạn có thể mã hóa các phần được mã hóa vv mà không gặp bất kỳ khó khăn nào.

Việc giải mã sẽ được thực hiện tự động bởi bất kỳ trình phân tích cú pháp XML nào được sử dụng để xử lý HTML được mã hóa của bạn.

0

tôi nghĩ rằng câu trả lời phụ thuộc vào những gì bạn định làm với nội dung html và cũng loại nội dung html bạn định hỗ trợ.

Đặc biệt khi nói đến javascript được bao gồm, mã hóa thường dẫn đến sự cố. CDATA chắc chắn sẽ giúp bạn ở đó.

Nếu bạn dự định chỉ sử dụng các đoạn nhỏ (ví dụ: đoạn văn) và có cách để xử lý trước/lọc (vì oyu không muốn javascript hoặc những thứ ưa thích), bạn có thể sẽ tốt hơn khi mã hóa hoặc thực sự đặt nó trực tiếp như subtree trong xml. Sau đó, bạn có thể xử lý html (tức là kiểu bộ lọc hoặc thuộc tính onclick). Nhưng điều này chắc chắn là nhiều việc hơn.

1

Tôi không biết bạn đang sử dụng công cụ xây dựng XML nào, nhưng PHP (thực sự là libxml) biết cách xử lý ]]> bên trong các phần CDATA và vì vậy mọi khung công tác XML khác. Vì vậy, tôi muốn sử dụng một phần CDATA.

0

Bạn có thể sử dụng kết hợp cả hai. Ví dụ: bạn muốn vượt qua <h1>....</h1> trong nút xml bạn đã sử dụng phần CDATA để chuyển nó. Nội dung bên trong <h1>...</h1> phải được mã hóa thành các thực thể html như ví dụ: &lt;, cho <. Mã hóa giữa các thẻ sẽ giải quyết được vấn đề]]> nhận được thông dịch khi thẻ được chuyển thành ]]&gt; và thẻ html không chứa ]]>.

Bạn chỉ có thể thực hiện việc này nếu html được tạo bởi chính bạn.

1

Có ý nghĩa khi bao bọc HTML trong CDATA. Văn bản HTML có thể sẽ tạo thành một giá trị duy nhất trong XML.

Vì vậy, không gói nó trong CDATA sẽ làm cho tất cả các trình phân tích cú pháp xml đọc nó như một phần của tài liệu XML. Mặc dù rất dễ dàng để vượt qua vấn đề này trong khi sử dụng xml, tại sao lại gây thêm đau đầu?

Nếu bạn muốn phân tích cú pháp HTML thành DOM, thì tốt hơn là đọc văn bản HTML và thiết lập trình phân tích cú pháp để đọc bài kiểm tra riêng.

Hy vọng rằng tôi đã nghĩ ra cách tôi dự định.

11

CDATA dễ đọc hơn trong khi nội dung được mã hóa có thể kết thúc đánh dấu CDATA một cách an toàn - nhưng bạn không phải quan tâm. Chỉ cần sử dụng một thư viện XML và ngừng lo lắng về nó. Sau đó, tất cả những gì bạn phải nói là "Đặt văn bản này vào bên trong phần tử này" và thư viện sẽ mã hóa nó hoặc bọc nó trong các dấu CDATA.

1

Cá nhân, tôi ghét phân đoạn CDATA, vì vậy tôi sẽ sử dụng mã hóa để thay thế. Tất nhiên, nếu bạn thêm XML vào XML thành XML thì điều này sẽ dẫn đến mã hóa mã hóa trên mã hóa và do đó một số kết quả rất khó đọc. Tại sao tôi ghét phân đoạn CDATA? Tôi ước tôi đã biết. Sở thích cá nhân, chủ yếu là. Tôi chỉ không thích làm quen với việc thêm "các nhân vật bị cấm" bên trong một phân khúc đặc biệt, nơi họ đột nhiên sẽ được phép trở lại. Nó chỉ gây nhầm lẫn cho tôi khi tôi thấy đánh dấu XML trong một phân đoạn CDATA và nó không phải là một phần của XML xung quanh nó. Ít nhất với mã hóa tôi sẽ thấy rằng nó được mã hóa.

Thư viện XML tốt sẽ xử lý cả phân đoạn mã hóa và CDATA một cách minh bạch. Chỉ là đôi mắt của tôi bị tổn thương.

0

Nếu HTML của bạn được tạo đúng, sau đó chỉ cần nhúng các thẻ HTML mà không cần thoát hoặc gói trong CDTATA. Nếu có thể, nó giúp giữ nội dung của bạn trong XML. Nó cho phép bạn linh hoạt hơn để chuyển đổi và thao tác tài liệu.

Bạn có thể đặt không gian tên cho HTML, để bạn có thể phân tách các thẻ HTML của bạn từ XML khác gói nó.

Văn bản thoát có nghĩa là toàn bộ khối HTML sẽ là một nút văn bản lớn. Việc gói trong CDATA yêu cầu trình phân tích cú pháp XML không phân tích cú pháp phần đó. Nó có thể là "dễ dàng hơn", nhưng hạn chế khả năng của bạn xuống cấp và chỉ nên được sử dụng khi thích hợp; không chỉ vì nó thuận tiện hơn. Escaped markup is considered harmful.

+1

HTML không nhất thiết là hợp lệ XML (ví dụ, HTML không yêu cầu đóng thẻ). Họ trông giống nhau bởi vì họ chia sẻ SGML như là tổ tiên chung của họ. Tùy chọn duy nhất thực sự là để thoát khỏi dữ liệu, hoặc sử dụng cdata. Nếu không, trình phân tích cú pháp XML sẽ sụp đổ khi tìm thấy đánh dấu không đúng định dạng. –

3

Nếu bạn sử dụng CDATA, thì bạn phải giải mã chính xác (textContent, value và innerHTML là các phương thức KHÔNG trả lại dữ liệu thích hợp).

chúng ta hãy nói rằng bạn sử dụng một cấu trúc xml tương tự như sau:

<response> 
    <command method="setcontent"> 
     <fieldname>flagOK</fieldname> 
     <content>479</content> 
    </command> 
    <command method="setcontent"> 
     <fieldname>htmlOutput</fieldname> 
     <content> 
      <![CDATA[ 
      <tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.7242,-50.2352</a></td></tr> 
      ]]> 
     </content> 
    </command> 
</response> 

trong javascript, sau đó bạn sẽ giải mã bằng cách tải xml (jquery, ví dụ) vào một biến như XMLdoc dưới đây và sau đó nhận được các nodeValue cho sự xuất hiện thứ 2 (item(1)) của thẻ content

xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue 

hoặc (cả hai ký hiệu là tương đương)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue