CDATA
Termin CDATA , oznaczający dane znakowe , jest używany do różnych, ale powiązanych celów w językach znaczników SGML i XML . Termin ten wskazuje, że pewna część dokumentu to ogólne dane znakowe , a nie dane niebędące znakami lub dane znakowe o bardziej szczegółowej, ograniczonej strukturze.
Sekcje CDATA w XML
W dokumencie XML lub jednostce zewnętrznej sekcja CDATA to fragment treści elementu, który jest oznaczony tak, aby można go było interpretować dosłownie, jako dane tekstowe, a nie jako oznaczoną treść. Sekcja CDATA jest jedynie alternatywną składnią do wyrażania danych znakowych; nie ma różnicy semantycznej między danymi znakowymi w sekcji CDATA a danymi znakowymi w standardowej składni, gdzie na przykład „ <
” i „ &
” są reprezentowane odpowiednio przez „ <
” i „ &
”.
Składnia i interpretacja
Sekcja CDATA zaczyna się od następującej sekwencji:
< ![CDATA[
i kończy się kolejnym wystąpieniem ciągu:
]]>
Wszystkie znaki zawarte między tymi dwiema sekwencjami są interpretowane jako znaki, a nie znaczniki lub odwołania do jednostek. Każdy znak jest traktowany dosłownie, jedynym wyjątkiem jest ciąg znaków ]]> .
W:
<nadawca> Jan Kowalski </nadawca>
początkowe i końcowe znaczniki „nadawcy” są interpretowane jako znaczniki. Jednak kod:
<![CDATA[<sender> <i>John Smith</i> <b>John Smith</b></sender> <i>]]></i> <b>]]></b>
jest równa:
< nadawca > John Smith < /nadawca >
W ten sposób „tagi” będą miały dokładnie taki sam status jak „Jan Kowalski”; będą traktowane jako tekst.
Podobnie, jeśli odwołanie do znaku numerycznego ð
pojawi się w treści elementu, zostanie zinterpretowany jako pojedynczy znak Unicode 00F0 (mała litera eth ). Ale jeśli to samo pojawi się w sekcji CDATA, zostanie przeanalizowane jako sześć znaków: ampersand, znak krzyżyka, cyfra 2, cyfra 4, cyfra 0, średnik.
Zastosowania sekcji CDATA
Nowi autorzy dokumentów XML często błędnie rozumieją cel sekcji CDATA, błędnie wierząc, że jej celem jest „ochrona” danych przed traktowaniem ich jako zwykłych danych znakowych podczas przetwarzania. Niektóre interfejsy API do pracy z dokumentami XML oferują opcje niezależnego dostępu do sekcji CDATA, ale takie opcje istnieją poza normalnymi wymaganiami systemów przetwarzania XML i nadal nie zmieniają ukrytego znaczenia danych. Dane znakowe to dane znakowe, niezależnie od tego, czy są wyrażone za pomocą sekcji CDATA, czy zwykłego znacznika. Sekcje CDATA są przydatne do pisania kodu XML jako danych tekstowych w dokumencie XML. Na przykład, jeśli ktoś chce złożyć książkę z XSL wyjaśniającym użycie aplikacji XML, znaczniki XML, które pojawią się w samej książce, zostaną zapisane w pliku źródłowym w sekcji CDATA.
Zagnieżdżanie
Sekcja CDATA nie może zawierać ciągu znaków „ ]]>
” i dlatego nie jest możliwe, aby sekcja CDATA zawierała zagnieżdżone sekcje CDATA. Preferowanym podejściem do używania sekcji CDATA do kodowania tekstu zawierającego triadę „ ]]>
” jest użycie wielu sekcji CDATA przez dzielenie każdego wystąpienia triady tuż przed „ >
”. Na przykład, aby zakodować „ ]]>
” należałoby napisać:
<![CDATA[]]]]><![CDATA[>]]>
Oznacza to, że aby zakodować „ ]]>
” w środku sekcji CDATA, zamień wszystkie wystąpienia „ ]]>
” na:
]]]]> <![CDATA[>
To skutecznie zatrzymuje i ponownie uruchamia sekcję CDATA.
Problemy z kodowaniem
W danych tekstowych każdy znak Unicode niedostępny w kodowaniu zadeklarowanym w nagłówku <?xml ...?>
może być reprezentowany za pomocą &#nnn;
odniesienie do znaku numerycznego . Ale tekst w sekcji CDATA jest ściśle ograniczony do znaków dostępnych w kodowaniu.
Z tego powodu programowe używanie sekcji CDATA do cytowania danych, które potencjalnie mogą zawierać znaki „ &
” lub „ <
”, może powodować problemy, gdy dane zawierają znaki, których nie można przedstawić w kodowaniu. W zależności od implementacji kodera, znaki te mogą zostać utracone, mogą zostać przekonwertowane na znaki &#nnn;
odniesienie do znaku lub może spowodować niepowodzenie kodowania. Nie będą one jednak konserwowane.
Inną kwestią jest to, że dokument XML może zostać transkodowany z jednego kodowania do drugiego podczas transportu. Gdy XML jest konwertowany na bardziej ograniczony zestaw znaków, taki jak ASCII, znaki, których nie można już reprezentować, są konwertowane na &#nnn;
odniesienia do znaków dla bezstratnej konwersji. Ale w sekcji CDATA te znaki nie mogą być w ogóle reprezentowane i muszą zostać usunięte lub przekonwertowane na jakiś odpowiednik, zmieniając zawartość sekcji CDATA.
Użycie CDATA w danych wyjściowych programu
Sekcje CDATA w dokumentach XHTML mogą być analizowane inaczej przez przeglądarki internetowe, jeśli renderują dokument jako HTML, ponieważ parsery HTML nie rozpoznają znaczników początku i końca CDATA ani nie rozpoznają odniesień do encji HTML, takich jak < ;
wewnątrz znaczników <script>
. Może to powodować problemy z renderowaniem w przeglądarkach internetowych i może prowadzić do skrypty krzyżowe , jeśli są używane do wyświetlania danych z niezaufanych źródeł, ponieważ dwa rodzaje parserów nie zgadzają się co do tego, gdzie kończy się sekcja CDATA.
Ponieważ przydatna jest możliwość używania znaków mniejszości ( <
) i ampersandów ( &
) w skryptach stron internetowych, a w mniejszym stopniu w stylach, bez konieczności pamiętania o ich zmianie, często stosuje się znaczniki CDATA wokół tekst wbudowanych elementów <script>
i <style>
w dokumentach XHTML. Ale aby dokument mógł być również analizowany przez parsery HTML, które nie rozpoznają znaczników CDATA, znaczniki CDATA są zwykle komentowane, jak w tym przykładzie JavaScript :
< typ skryptu = "text/javascript" > //<![CDATA[ dokument . napisz ( "<" ); //]]> </ skrypt >
lub ten przykład CSS :
< style type = "text/css" > /*<![CDATA[*/ body { obraz tła : url ( "marble.png?width=300&height=300" ) } /*]]>*/ </ styl >
Ta technika jest konieczna tylko w przypadku używania wbudowanych skryptów i arkuszy stylów i jest specyficzna dla języka. Na przykład arkusze stylów CSS obsługują tylko drugi styl komentowania ( /* … */
), ale CSS ma również mniejsze zapotrzebowanie na znaki <
i &
niż JavaScript, a zatem mniejsze zapotrzebowanie na jawne znaczniki CDATA.
CDATA w DTD
Wartość atrybutu typu CDATA
W plikach definicji typu dokumentu (DTD) dla SGML i XML wartość atrybutu może być określona jako typu CDATA: dowolne dane znakowe. W atrybucie typu CDATA dozwolone są znaczniki odwołań do znaków i jednostek, które będą przetwarzane podczas czytania dokumentu.
Na przykład, jeśli DTD XML zawiera
<!ATTLIST foo a CDATA #IMPLIED >
oznacza to, że elementy o nazwie foo mogą opcjonalnie mieć atrybut o nazwie „ a ”, który jest typu CDATA. W dokumencie XML, który jest poprawny zgodnie z tym DTD, może pojawić się taki element:
<foo a= "1 i 2 to < 3 
" />
a parser XML zinterpretowałby wartość atrybutu „ a ” jako dane znakowe „ 1 i 2 to < 3 ”.
Jednostka typu CDATA
DTD SGML lub XML może również zawierać deklaracje jednostek, w których token CDATA jest używany do wskazania, że jednostka składa się z danych znakowych. Dane znakowe mogą pojawić się w samej deklaracji lub mogą być dostępne zewnętrznie, do których odwołuje się identyfikator URI . W obu przypadkach znaczniki odwołań do znaków i odwołań do jednostek parametrów są dozwolone w jednostce i będą przetwarzane jako takie, gdy zostaną odczytane.
<DISPLAY_NAME Atrybut= "Y" > <![CDATA[PFTEST0__COUNTER_6__:4:199:, PFTEST0__COUNTER_7__:4:199:]]> </DISPLAY_NAME> <SVLOBJECT><LONG name= "" val= "" INTEGER name= " " val= "" LONG name= "" val= "" /></SVLOBJECT>