Różnica między PCDATA i CDATA w DTD


86

Jaka jest różnica między #PCDATAi #CDATAw DTD ?



Nazwy słów kluczowych używanych w DTD XML to #PCDATAi CDATA. Nie ma PCDATAsłowa kluczowego i nie #CDATA.
mzjn

1
Oprócz zaakceptowanej odpowiedzi przeczytaj również stackoverflow.com/a/918462/2013911, ponieważ wyjaśnia on różnicę między typem atrybutu CDATA a sekcjami oznaczonymi <! [CDATA []]>.
Niklas Peter

Odpowiedzi:


75

PCDATA - przeanalizowane dane znaków

Parsery XML zwykle analizują cały tekst w dokumencie XML.

CDATA - (Unparsed) Character Data

Termin CDATA jest używany w odniesieniu do danych tekstowych, które nie powinny być analizowane przez parser XML.

Znaki takie jak „<” i „&” są niedozwolone w elementach XML.


77
  • PCDATAjest tekstem, który zostanie przeanalizowany przez parser. Tagi wewnątrz tekstu będą traktowane jako znaczniki, a encje zostaną rozwinięte.
  • CDATAto tekst, który nie zostanie przeanalizowany przez parser. Tagi wewnątrz tekstu nie będą traktowane jako znaczniki, a encje nie będą rozwijane.

Domyślnie wszystko jest PCDATA. W poniższym przykładzie zignorowanie katalogu głównego <bar>zostanie przeanalizowane i nie będzie zawierało treści, ale jedno dziecko.

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

Kiedy chcemy określić, że element będzie zawierał tylko tekst i żadnych elementów podrzędnych, używamy słowa kluczowego PCDATA, ponieważ to słowo kluczowe określa, że ​​element musi zawierać analizowalne dane znakowe - czyli dowolny tekst z wyjątkiem znaków mniejszych niż (< ), większe niż ( >), ampersand ( &), quote ( ') i podwójny cudzysłów ( ").

W następnym przykładzie <bar>zawieraCDATA . Jego zawartość nie zostanie przeanalizowana i dlatego jest <test>content!</test>.

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

W SGML istnieje kilka modeli zawartości. Model #PCDATAtreści mówi, że element może zawierać zwykły tekst. Część „przeanalizowana” oznacza, że ​​znaczniki (w tym PI, komentarze i dyrektywy SGML) są analizowane, a nie wyświetlane jako surowy tekst. Oznacza to również, że odniesienia do jednostek są zastępowane.

Innym typem modelu treści, który pozwala na zwykły tekst, jest CDATA . W XML, model zawartości elementu nie może być domyślnie ustawiony na CDATA, ale w SGML oznacza to, że znaczniki i odniesienia do encji są ignorowane w zawartości elementu. Jednak w atrybutach CDATAtypu zastępowane są odniesienia do encji.

W XML #PCDATAto jedyny model zawartości zwykłego tekstu. Używasz go, jeśli w ogóle chcesz zezwolić na zawartość tekstową w elemencie. Model CDATAzawartości może być używany jawnie za pośrednictwem CDATAznaczników blokowych w#PCDATA , ale zawartość elementu nie może być definiowana CDATAdomyślnie.

W DTD atrybut zawierający tekst musi mieć taki typ CDATA. Słowo CDATAkluczowe w deklaracji atrybutu ma inne znaczenie niż CDATAsekcja w dokumencie XML. W CDATAsekcji wszystkie znaki są zgodne z prawem (w tym <, >, &,' oraz "znaków), z wyjątkiem ]]>znacznika końcowego.

#PCDATAnie jest odpowiedni dla typu atrybutu. Jest używany jako tekst typu „liść”.

#PCDATAjest poprzedzony hashem w modelu treści, aby odróżnić to słowo kluczowe od elementu o nazwie PCDATA(co byłoby całkowicie legalne).


6
Świetna odpowiedź, poza ostatnim zdaniem. #nie jest hashtagiem. Tylko tag poprzedzony tym symbolem jest hashtagiem. Sam symbol ma wiele nazw , w tym „znak cyfry”, „znak funta” (głównie Kanada i USA) lub po prostu „krzyżyk” (stąd nazwa „hashtag”).

6
#justhadtogetthatoffmychest

3
Nie zgadzam się, że # przed nim #PCDATAjest z powodów historycznych. Dzieje się tak, ponieważ w DTD element może również zawierać element o nazwie PCDATA, który musi być możliwy i który będzie wyglądał <!ELEMENT foo (PCDATA)>.
Mathias Müller

Cytowanie i podwójne cudzysłowy są całkowicie legalne w zawartości PCDATA. Znak ampersand może pojawić się, ale (w XML) tylko jako element wprowadzający encję.
Toby Speight

12

PCDATA - przeanalizowane dane znakowe.Analizuje wszystkie dane w dokumencie XML.

Przykład:

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

Tutaj <family>element zawiera jeszcze 2 elementy: <mother>i <father>. Dlatego analizuje się dalej, aby tekst matki i ojca podawał wartość tekstową rodziny jako „mama tato”

CDATA - nieprzetworzone dane znakowe. To są dane, które nie powinny być dalej analizowane w dokumencie xml.

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

Tutaj wartość tekstowa rodziny będzie <mother>mom</mother><father>dad</father>.


11

Stąd ( Google to twój przyjaciel ):

W DTD, PCDATA i CDATA są używane do stwierdzenia, odpowiednio, dopuszczalnej zawartości elementów i atrybutów. W modelu zawartości elementu #PCDATA mówi, że element zawiera (może zawierać) „dowolny stary tekst”. (Z wyjątkami wymienionymi poniżej.) W deklaracji atrybutu CDATA jest jednym z rodzajów ograniczeń, które można nałożyć na dopuszczalne wartości atrybutu (inne rodzaje, wszystkie wzajemnie się wykluczające, obejmują ID, IDREF i NMTOKEN). Atrybut, którego dopuszczalne wartości to CDATA, może (podobnie jak PCDATA w elemencie) zawierać „dowolny stary tekst”.

Potencjalnie naprawdę zagmatwanym problemem jest to, że istnieje inny „CDATA”, nazywany również zaznaczonymi sekcjami. Zaznaczona sekcja to część treści elementu (#PCDATA) oddzielona specjalnymi ciągami znaków: do jej zamknięcia. Jeśli pamiętasz, że PCDATA to „przeanalizowane dane znakowe”, sekcja CDATA jest dosłownie tym samym, bez „przeanalizowanej”. Parsery przesyłają zawartość zaznaczonej sekcji do podrzędnych aplikacji bez czkawki za każdym razem, gdy napotkają znaki specjalne, takie jak <i &. Jest to przydatne, gdy kodujesz dokument zawierający wiele tych znaków specjalnych (takich jak skrypty i fragmenty kodu); jest łatwiejszy do wprowadzania danych i łatwiejszy do odczytania niż odpowiednie odniesienie do encji.

Możesz więc wywnioskować, że wyjątkiem od reguły „dowolny stary tekst” jest to, że PCDATA nie może zawierać żadnego z tych znaków specjalnych bez zmiany znaczenia, chyba że wchodzą one w zakres sekcji oznaczonej przez CDATA.


3

Podstawowa różnica między PCDATA i CDATA to

PCDATA - zasadniczo używane dla ELEMENTS while

CDATA - używane dla atrybutów XML, np. ATTLIST


0

CDATA ( C haracter DATA ): Jest podobny do komentarza, ale jest częścią dokumentu. tj. CDATA jest danymi, jest częścią dokumentu, ale dane nie mogą być analizowane w XML.
Uwaga: komentarz XML jest pomijany podczas analizowania XML, ale CDATA pokazuje, jak jest.

PCDATA ( P arsed C haracter DATA ): Domyślnie wszystko to PCDATA. PCDATA to dane, które można analizować w formacie XML.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.