2009-05-13 43 views
26

có vẻ như một định nghĩa lỏng lẻo của PCDATA và CDATA làPCDATA và CDATA thực sự là gì?

  1. PCDATA là dữ liệu nhân vật, nhưng để được phân tích.
  2. CDATA là dữ liệu ký tự và không phải là để được phân tích cú pháp.

nhưng sau đó ai đó đã nói với tôi rằng CDATA thực sự được phân tích cú pháp hoặc PCDATA thực sự không được phân tích cú pháp ... do đó, có một chút nhầm lẫn. Có ai biết thỏa thuận thực sự không?

Cập nhật: Tôi thực sự đã thêm định nghĩa PCDATA trên Wikipedia ... do đó, đừng có trả lời quá nghiêm túc vì đó chỉ là sự hiểu biết sơ bộ về nó.

+0

Sự nhầm lẫn có thể được gây ra bởi thực tế là CDATA có thể được phân tích cú pháp, nhưng bằng một trình phân tích cú pháp khác. Ví dụ, nội dung của phần tử 'script', là CDATA trong HTML, được phân tích bởi trình thông dịch Javascript. –

Trả lời

22

Từ WIKI:

PCDATA

nói đơn giản, PCDATA là viết tắt của phân tích nhân vật Data. Điều đó có nghĩa là các ký tự sẽ được phân tích bởi trình phân tích cú pháp XML, XHTML hoặc HTML. (&lt; sẽ được đổi thành <, <p> sẽ được thực hiện để có nghĩa là thẻ đoạn, v.v.). So sánh điều đó với CDATA, trong đó các ký tự không được phân tích bằng trình phân tích cú pháp XML, XHTML hoặc HTML.

CDATA

Thuật ngữ CDATA, có nghĩa là dữ liệu nhân vật, được sử dụng để phân biệt, nhưng có liên quan các mục đích trong ngôn ngữ đánh dấu SGML và XML. Thuật ngữ chỉ ra rằng một phần nhất định của tài liệu là dữ liệu ký tự chung, thay vì dữ liệu không phải ký tự hoặc dữ liệu ký tự có cấu trúc hạn chế và cụ thể hơn.

0

định nghĩa đầu tiên của bạn là đúng.

PCDATA được phân tích cú pháp có nghĩa là các thực thể được mở rộng và văn bản đó được coi là đánh dấu. CDATA không được phân tích bởi một trình phân tích cú pháp XML.

9

Cả hai PCDATA và CDATA đều được phân tích cú pháp. Cả hai dữ liệu đều là ký tự.

Cả hai chỉ phải bao gồm các ký tự hợp lệ. Ví dụ: nếu mã hóa tài liệu của bạn là UTF-8, nội dung của phần CDATA vẫn phải là ký tự UTF-8 hợp lệ. Vì vậy, dữ liệu nhị phân ngẫu nhiên có thể sẽ ngăn không cho tài liệu được tạo đúng. Ngoài ra các phần CDATA vẫn được phân tích cú pháp, nếu chỉ để tìm thẻ phần cuối. Nhưng các ký tự giống như đánh dấu khác, chẳng hạn như <,> và & bị bỏ qua và được truyền bởi trình phân tích cú pháp.

OTOH trong PCDATA litteral < và & (và 'hoặc' trong giá trị thuộc tính) phải được thoát hoặc chúng sẽ được hiểu là đánh dấu. Các thực thể cũng sẽ được mở rộng.

Vì vậy, có, các phần CDATA thực sự được phân tích cú pháp. Tôi không chắc chắn lý do tại sao bạn đã nói rằng PCDATA không được phân tích cú pháp mặc dù.

3
  • PCDATA là văn bản sẽ được phân tích bởi trình phân tích cú pháp. Các thẻ bên trong văn bản sẽ được coi là đánh dấu và các thực thể sẽ được mở rộng.
  • CDATA là văn bản sẽ không được phân tích bởi trình phân tích cú pháp. Các thẻ bên trong văn bản sẽ không được coi là đánh dấu và thực thể sẽ không được mở rộng.

Theo mặc định, mọi thứ đều là PCDATA. Trong ví dụ sau, bỏ qua thư mục gốc, sẽ được phân tích cú pháp, và nó sẽ không có nội dung, nhưng một đứa trẻ.

<?xml version="1.0"?> 
<foo> 
<bar><test>content!</test></bar> 
</foo> 

Khi chúng ta muốn xác định rằng một phần tử sẽ chỉ chứa văn bản, và không có phần tử con, chúng tôi sử dụng PCDATA từ khóa, bởi vì từ khóa này xác định rằng nguyên tố này phải chứa dữ liệu nhân vật được phân tách - có nghĩa là, bất kỳ văn bản trừ các ký tự ít hơn (<), lớn hơn (>), dấu và (&), trích dẫn (') và dấu ngoặc kép (").

Trong ví dụ tiếp theo, thanh là CDATA và không được phân tích cú pháp và có nội dung "nội dung!".

<?xml version="1.0"?> 
<foo> 
<bar><![CDATA[<test>content!</test>]]></bar> 
</foo> 

Có một số mô hình nội dung trong SGML. Mô hình nội dung #PCDATA nói rằng một phần tử có thể chứa văn bản thuần túy. Phần "được phân tích cú pháp" của nó có nghĩa là đánh dấu (bao gồm PI, nhận xét và chỉ thị SGML) trong đó được phân tích cú pháp thay vì hiển thị dưới dạng văn bản thô. Nó cũng có nghĩa là các tham chiếu thực thể được thay thế.

Một loại mô hình nội dung khác cho phép nội dung văn bản thuần tuý là CDATA. Trong XML, mô hình nội dung phần tử có thể không ngầm được đặt thành CDATA, nhưng trong SGML, nó có nghĩa là các tham chiếu đánh dấu và thực thể được bỏ qua trong nội dung của phần tử. Tuy nhiên, trong các thuộc tính của kiểu CDATA, các tham chiếu thực thể được thay thế.

Trong XML #PCDATA là mô hình nội dung văn bản thuần túy duy nhất. Bạn sử dụng nó nếu bạn muốn cho phép nội dung văn bản trong phần tử. Mô hình nội dung CDATA có thể được sử dụng rõ ràng thông qua đánh dấu khối CDATA trong #PCDATA, nhưng nội dung phần tử có thể không được định nghĩa là CDATA theo mặc định.

Trong DTD, loại thuộc tính chứa văn bản phải là CDATA. Từ khóa CDATA trong một khai báo thuộc tính có một ý nghĩa khác với phần CDATA trong một tài liệu XML. Trong phần CDATA, tất cả các ký tự đều hợp pháp (bao gồm <,>, &, 'và' ký tự) ngoại trừ thẻ kết thúc “]]>”.

#PCDATA không phù hợp với loại thuộc tính. Nó được sử dụng cho loại văn bản "lá".

#PCDATA được thêm bởi thẻ bắt đầu bằng # chỉ đơn giản vì lý do lịch sử.

0

Nếu chỉ các phần tử được đặt thành CDATA theo mặc định trong DTD XHTML, nó sẽ tiết kiệm được rất nhiều ghi đè thủ công xấu xí ... Tại sao khối tập lệnh chứa các phần tử khác? Nếu có các phần tử như vậy, chúng được xử lý bởi trình thông dịch JS trong các hành động thao tác DOM - trong trường hợp đó chúng vẫn phải được trình phân tích cú pháp XML bỏ qua hoàn toàn trước khi chèn và dựng tài liệu. Tôi cho rằng nó có thể đã được thiết kế để ép buộc sử dụng các tệp tài nguyên tập lệnh bên ngoài, điều cuối cùng là một điều tốt.

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