Sự khác biệt giữa PCDATA và CDATA trong DTD


86

Sự khác biệt giữa #PCDATA#CDATAtrong DTD là gì?



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

1
Ngoài câu trả lời được chấp nhận, bạn nên đọc 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à phần được đánh dấu <! [CDATA []]>.
Niklas Peter

Câu trả lời:


75

PCDATA - Dữ liệu ký tự được phân tích cú pháp

Trình phân tích cú pháp XML thường phân tích cú pháp tất cả văn bản trong tài liệu XML.

CDATA - Dữ liệu ký tự (Chưa phân tích)

Thuật ngữ CDATA được sử dụng về dữ liệu văn bản không được phân tích cú pháp bởi trình 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.


77
  • PCDATAlà văn bản sẽ được phân tích cú pháp 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.
  • CDATAlà văn bản sẽ không được phân tích cú pháp 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à các thực thể sẽ không được mở rộng.

Theo mặc định, mọi thứ đều như vậy PCDATA. Trong ví dụ sau, bỏ qua phần gốc, <bar>sẽ được phân tích cú pháp và nó sẽ không có nội dung, mà chỉ có một phần tử con.

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

Khi chúng tôi muốn chỉ đị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 từ khóa PCDATA, bởi vì từ khóa này chỉ định rằng phần tử phải chứa dữ liệu ký tự có thể phân tích cú pháp - nghĩa là bất kỳ văn bản nào ngoại trừ các ký tự nhỏ hơn ( <), lớn hơn ( >), dấu và ( ), dấu ngoặc kép &( ') và dấu ngoặc kép ( ").

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

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

Có một số mô hình nội dung trong SGML. Các #PCDATAmô hình nội dung nói rằng một yếu tố có thể chứa văn bản đơn giản. 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 nó đượ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 túy là CDATA. Trong XML, mô hình nội dung phần tử có thể không được đặt thành CDATA, nhưng trong SGML, điều đó có nghĩa là các tham chiếu đánh dấu và thực thể bị bỏ qua trong nội dung của phần tử. CDATATuy nhiên, trong các thuộc tính của kiểu, các tham chiếu thực thể được thay thế.

Trong XML, #PCDATAlà 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ử. Các CDATAmô hình nội dung có thể được sử dụng một cách rõ ràng thông qua việc CDATAđánh dấu khối trong #PCDATA, nhưng nội dung tố có thể không được định nghĩa là CDATAmỗi mặc định.

Trong một DTD, loại thuộc tính có chứa văn bản phải là CDATA. Các CDATAtừ khóa trong một tuyên bố thuộc tính có một ý nghĩa khác nhau hơn so với CDATAphần trong một tài liệu XML. Trong một CDATAphần tất cả các nhân vật đều hợp pháp (bao gồm <, >, &, '"ký tự), ngoại trừ ]]>thẻ kết thúc.

#PCDATAkhô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 trong mô hình nội dung để phân biệt từ khóa này với một phần tử được đặt tên PCDATA(sẽ hoàn toàn hợp pháp).


6
Câu trả lời tuyệt vời, ngoại trừ câu cuối cùng. #không phải là một thẻ bắt đầu bằng #. Chỉ một thẻ đứng trước biểu tượng này là một thẻ bắt đầu bằng #. Bản thân biểu tượng có nhiều tên , bao gồm "ký hiệu số", "ký hiệu bảng Anh" (chủ yếu là Canada và Hoa Kỳ), hoặc chỉ "băm" (do đó có tên là 'thẻ bắt đầu bằng #').

6
#justhadtogetthatoffmychest

3
Tôi không đồng ý rằng # ở phía trước #PCDATAlà có vì lý do lịch sử. Nó ở đó 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, phần tử này phải có thể và sẽ trông như thế nào <!ELEMENT foo (PCDATA)>.
Mathias Müller

Trích dẫn và trích dẫn kép hoàn toàn hợp pháp trong nội dung PCDATA. Và dấu và có thể xuất hiện, nhưng (trong XML) chỉ như một người giới thiệu thực thể.
Toby Speight

12

PCDATA - dữ liệu ký tự được phân tích cú pháp. Nó phân tích cú pháp tất cả dữ liệu trong một tài liệu XML.

Thí dụ:

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

Ở đây, <family>phần tử chứa thêm 2 phần tử: <mother><father>. Vì vậy, nó phân tích cú pháp xa hơn để lấy văn bản của mẹ và cha để cung cấp giá trị văn bản của gia đình là "bố mẹ"

CDATA - Dữ liệu ký tự chưa được phân tích. Đây là dữ liệu không nên đượ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ị văn bản của gia đình sẽ là <mother>mom</mother><father>dad</father>.


11

Từ đây ( Google là bạn của bạn ):

Trong DTD, PCDATA và CDATA được sử dụng để khẳng định điều gì đó về nội dung được phép của các phần tử và thuộc tính, tương ứng. Trong mô hình nội dung của phần tử, #PCDATA cho biết phần tử chứa (có thể chứa) "bất kỳ văn bản cũ nào". (Với các ngoại lệ như được lưu ý bên dưới.) Trong khai báo của thuộc tính, CDATA là một loại ràng buộc bạn có thể đặt trên các giá trị cho phép của thuộc tính (các loại khác, tất 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 một phần tử) chứa "bất kỳ văn bản cũ nào".

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

Vì vậy, bạn có thể suy ra rằng ngoại lệ đối với quy tắc "bất kỳ văn bản cũ nào" là PCDATA không thể bao gồm bất kỳ ký tự đặc biệt nào trong số các ký tự đặc biệt không thoát này, BẤT CHẤP chúng nằm trong phạm vi của phần được đánh dấu CDATA.


3

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

PCDATA - Về cơ bản được sử dụng cho ELEMENTS trong khi

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


0

CDATA ( C haracter DATA ): Nó tương tự như một 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 ý: Chú thích XML bị bỏ qua trong khi phân tích cú pháp XML nhưng CDATA hiển thị như vậy.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.