2009-05-27 18 views
71

Sự khác nhau giữa #PCDATA#CDATA trong DTD là gì?Sự khác biệt giữa PCDATA và CDATA trong DTD

+1

bản sao có thể có của [những gì thực sự là PCDATA và CDATA?] (Http://stackoverflow.com/questions/857876/what-actually-is-pcdata-and-cdata) –

+0

Tên của các từ khóa được sử dụng trong các DTD XML là '# PCDATA' và' CDATA'. Không có từ khóa 'PCDATA' và không có' # CDATA'. – mzjn

+0

Ngoài câu trả lời được chấp nhận, bạn nên đọc https://stackoverflow.com/a/918462/2013911 vì nó giải thích sự khác biệt giữa loại thuộc tính CDATA và các phần được đánh dấu. –

Trả lời

61

PCDATA - phân tích phân Character liệu

parsers XML thường phân tích tất cả các văn bản trong một tài liệu XML.

CDATA - (chưa phân tích) Character liệu

Thuật ngữ CDATA được sử dụng về dữ liệu văn bản mà không cần phải được phân tích bởi các phân tích cú pháp XML.

Các ký tự như "<" và "&" là bất hợp pháp trong các phần tử XML.

10

From here (Google is your friend):

Trong một DTD, PCDATA và CDATA được sử dụng để khẳng định điều gì đó về nội dung cho phép các phần tử và các thuộc tính, tương ứng. Trong nội dung của phần tử mô hình, #PCDATA cho biết rằng phần tử chứa (có thể chứa) "bất kỳ văn bản cũ nào". (Với trường hợp ngoại lệ như đã nêu dưới đây.) Trong khai của một thuộc tính, CDATA là một loại hạn chế bạn có thể đặt trên giá trị cho phép của thuộc tính (các loại khác, tất cả các loại trừ lẫn nhau, bao gồm ID, IDREF, và NMTOKEN). Thuộc tính có giá trị cho phép là CDATA có thể (như PCDATA trong phần tử) chứa "bất kỳ văn bản cũ nào".

Sự cố có thể gây nhầm lẫn là có một "CDATA", cũng được gọi là phần được đánh dấu. A phần được đánh dấu là một phần của phần tử (#PCDATA) được phân tách bằng các chuỗi đặc biệt: để đóng. Nếu bạn hãy nhớ rằng PCDATA được "phân tích cú pháp dữ liệu ký tự", một phần CDATA là theo nghĩa đen là giống nhau, mà không có "được phân tích cú pháp". Các trình phân tích cú pháp truyền tải nội dung của một phần được đánh dấu đến hạ lưu các ứng dụng mà không cần nấc cục mỗi thời gian chúng gặp phải các ký tự đặc biệt như < và &. Điều này hữu ích khi bạn đang mã hóa tài liệu chứa nhiều ký tự đặc biệt này (như đoạn mã và đoạn mã); nó là dễ dàng hơn khi nhập dữ liệu và dễ dàng hơn đối với việc đọc , so với tham chiếu tương ứng .

Vì vậy, bạn có thể suy ra rằng các ngoại lệ đối với sự "bất kỳ văn bản cũ" quy tắc là PCDATA không thể bao gồm bất kỳ những ký tự đặc biệt không thoát ra, trừ khi họ rơi trong phạm vi của một CDATA đánh dấu phần.

54
  • 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, <bar> sẽ được phân tích cú pháp và nó sẽ không có nội dung, nhưng một con.

<?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 nhân vật ít hơn (<), lớn hơn (>), dấu và (&), dấu ngoặc (') và dấu nháy kép (").

Trong ví dụ tiếp theo, <bar> chứa CDATA. Nội dung của nó sẽ không được được phân tích cú pháp và do đó là <test>content!</test>.

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

Có một số kiểu 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 vào bởi một hàm băm đơn giản vì lý do lịch sử.

+4

Câu trả lời hay, ngoại trừ câu cuối cùng. '#' không phải là thẻ bắt đầu bằng #. Chỉ một thẻ đứng trước ký hiệu này là thẻ bắt đầu bằng #. Bản thân biểu tượng có [nhiều tên] (https://en.wikipedia.org/wiki/Number_sign#Other_names_in_English), bao gồm "ký hiệu số", "dấu thăng" (chủ yếu là Canada & US), hoặc chỉ "băm" (do đó tên 'hashtag'). –

+4

#justhadtogetthatoffmychest –

+2

Tôi không đồng ý rằng số # ở phía trước '# PCDATA' có lý do lịch sử. Nó có ở đó bởi vì trong một DTD, một phần tử cũng có thể chứa một phần tử có tên 'PCDATA', mà phải có khả năng, và nó trông giống như' '. –

3

Sự khác biệt chính giữa rất PCDATA và CDATA là

PCDATA - Về cơ bản sử dụng cho các yếu tố trong khi

CDATA - Được sử dụng cho các thuộc tính của XML tức là ATTLIST

5

PCDATA - phân tích dữ liệu nhân vật. Nó phân tích cú pháp tất cả dữ liệu trong tài liệu xml.

Ví dụ:

<family> 
    <mother>mom</mother> 
    <father>dad</father> 
</family> 

Ở đây, yếu tố gia đình chứa thêm 2 yếu tố “mẹ”“cha”. Vì vậy, nó phân tích thêm để có được văn bản của cha mẹ để cung cấp cho các giá trị của gia đình như "cha mẹ"

CDATA - dữ liệu characted chưa được chứng thực. Đây là dữ liệu mà không được phân tích cú pháp thêm trong tài liệu xml.

<family> 
    <![CDATA[ 
     <mother>mom</mother> 
     <father>dad</father> 
    ]]> 
</family> 

Ở đây, giá trị của gia đình sẽ là <mother>mom</mother><father>dad</father>.

0

CDATA (C haracter DATA): Tương tự như nhận xét nhưng nó là một phần của tài liệu. tức là CDATA là một dữ liệu, nó là một phần của tài liệu nhưng dữ liệu không thể phân tích cú pháp trong XML.
Lưu ý: Bỏ qua nhận xét XML khi phân tích cú pháp XML nhưng CDATA hiển thị như vậy.

PCDATA (P arsed C haracter DỮ LIỆU): Theo mặc định, tất cả mọi thứ là PCDATA. PCDATA là một dữ liệu, nó có thể được phân tích cú pháp trong XML.

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