CDATA
Termen CDATA , som betyder teckendata , används för distinkta, men relaterade, syften i märkningsspråken SGML och XML . Termen indikerar att en viss del av dokumentet är allmänna teckendata snarare än icke-teckendata eller teckendata med en mer specifik, begränsad struktur.
CDATA-sektioner i XML
I ett XML-dokument eller extern enhet är en CDATA-sektion en del av elementinnehåll som är markerat för att tolkas bokstavligt, som textdata, inte som markerat innehåll. En CDATA-sektion är bara en alternativ syntax för att uttrycka teckendata; det finns ingen semantisk skillnad mellan teckendata i en CDATA-sektion och teckendata i standardsyntax där till exempel " <
" och " &
" representeras av " < "
respektive " & ".
Syntax och tolkning
En CDATA-sektion börjar med följande sekvens:
< ![CDATA[
och slutar med nästa förekomst av sekvensen:
]]>
Alla tecken som är inneslutna mellan dessa två sekvenser tolkas som tecken, inte uppmärkning eller enhetsreferenser. Varje tecken tas bokstavligt, det enda undantaget är teckensekvensen ]]> .
I:
<sender> John Smith </sender>
start- och sluttaggarna "avsändare" tolkas som uppmärkning. Men koden:
<![CDATA[<sender> <i>John Smith</i> <b>John Smith</b></sender> <i>]]></i> <b>]]></b>
är ekvivalent med:
< avsändare > John Smith < /sändare >
Således kommer "taggarna" att ha exakt samma status som "John Smith"; de kommer att behandlas som text.
På samma sätt, om den numeriska teckenreferensen ð
visas i elementinnehåll, kommer det att tolkas som det enda Unicode- tecknet 00F0 (liten bokstav eth ). Men om samma visas i en CDATA-sektion kommer den att tolkas som sex tecken: et-tecken, hash-tecken, siffra 2, siffra 4, siffra 0, semikolon.
Användning av CDATA-sektioner
Nya författare till XML-dokument missförstår ofta syftet med en CDATA-sektion, och tror felaktigt att dess syfte är att "skydda" data från att behandlas som vanliga teckendata under bearbetning. Vissa API:er för att arbeta med XML-dokument erbjuder alternativ för oberoende åtkomst till CDATA-sektioner, men sådana alternativ finns utöver de normala kraven för XML-behandlingssystem, och ändrar fortfarande inte den implicita betydelsen av datan. Teckendata är teckendata, oavsett om det uttrycks via en CDATA-sektion eller vanlig uppmärkning. CDATA-sektioner är användbara för att skriva XML-kod som textdata i ett XML-dokument. Om man till exempel vill typsätta en bok med XSL som förklarar användningen av en XML-applikation, kommer XML-uppmärkningen som ska visas i själva boken att skrivas i källfilen i en CDATA-sektion.
Häckande
En CDATA-sektion kan inte innehålla strängen " ]]>
" och därför är det inte möjligt för en CDATA-sektion att innehålla kapslade CDATA-sektioner. Den föredragna metoden för att använda CDATA-sektioner för att koda text som innehåller triaden " ]]>
" är att använda flera CDATA-sektioner genom att dela upp varje förekomst av triaden precis före " > "
. Till exempel, för att koda " ]]>
" skulle man skriva:
<![CDATA[]]]]><![CDATA[>]]>
Detta betyder att för att koda " ]]>
" i mitten av en CDATA-sektion, ersätt alla förekomster av " ]]>
" med följande:
]]]]> <![CDATA[>
Detta stoppar och startar om CDATA-sektionen.
Problem med kodning
I textdata kan alla Unicode-tecken som inte är tillgängliga i kodningen som deklareras i <?xml ...?>-
huvudet representeras med hjälp av en &#nnn;
numerisk teckenreferens . Men texten i en CDATA-sektion är strikt begränsad till de tecken som finns tillgängliga i kodningen.
På grund av detta kan användning av en CDATA-sektion programmatiskt för att citera data som potentiellt kan innehålla ' &
' eller ' <
'-tecken orsaka problem när data råkar innehålla tecken som inte kan representeras i kodningen. Beroende på implementeringen av kodaren kan dessa tecken gå vilse, kan konverteras till tecknen i &#nnn;
teckenreferens, eller kan orsaka att kodningen misslyckas. Men de kommer inte att underhållas.
En annan fråga är att ett XML- dokument kan omkodas från en kodning till en annan under transport. När XML- dokumentet konverteras till en mer begränsad teckenuppsättning, såsom ASCII, konverteras tecken som inte längre kan representeras till &#nnn;
teckenreferenser för en förlustfri konvertering. Men inom en CDATA-sektion kan dessa tecken inte representeras alls, och måste tas bort eller konverteras till någon motsvarighet, vilket ändrar innehållet i CDATA-sektionen.
Användning av CDATA i programutgång
CDATA-sektioner i XHTML- dokument kan tolkas annorlunda av webbläsare om de renderar dokumentet som HTML, eftersom HTML-tolkare inte känner igen CDATAs start- och slutmarkörer och inte heller känner igen HTML-entitetsreferenser som < ;
inom <script>
-taggar. Detta kan orsaka renderingsproblem i webbläsare och kan leda till skriptsårbarheter på flera ställen om det används för att visa data från opålitliga källor, eftersom de två typerna av parser inte kommer överens om var CDATA-avsnittet slutar.
Eftersom det är användbart att kunna använda mindre än-tecken ( <
) och et-tecken ( &
) i webbsidesskript, och i mindre utsträckning stilar, utan att behöva komma ihåg att undvika dem, är det vanligt att använda CDATA-markörer runt text av inline <script>-
och <style>
-element i XHTML-dokument. Men för att dokumentet också ska kunna tolkas av HTML-tolkare, som inte känner igen CDATA-markörerna, kommenteras CDATA-markörerna vanligtvis ut, som i detta JavaScript- exempel:
< script type = "text/javascript" > //<![CDATA[ dokument . skriv ( "<" ); //]]> </ script >
eller detta CSS- exempel:
< style type = "text/css" > /*<![CDATA[*/ body { background-image : url ( "marble.png?width=300&height=300" ) } /*]]>*/ </ style >
Denna teknik är endast nödvändig när du använder inline-skript och stilmallar och är språkspecifik. CSS-formatmallar, till exempel, stöder bara den andra stilen för att kommentera ut ( /* … */
), men CSS har också mindre behov av <
och &
-tecken än JavaScript och därför mindre behov av explicita CDATA-markörer.
CDATA i DTD:er
CDATA-typ attributvärde
I Document Type Definition- filer (DTD) för SGML och XML kan ett attributvärde betecknas som av typen CDATA: godtyckliga teckendata. Inom ett attribut av CDATA-typ är tecken- och entitetsreferensmarkering tillåten och kommer att bearbetas när dokumentet läses.
Till exempel om en XML DTD innehåller
<!ATTLIST foo a CDATA #IMPLIED >
det betyder att element som heter foo valfritt kan ha ett attribut som heter " a " som är av typen CDATA. I ett XML-dokument som är giltigt enligt denna DTD kan ett element som detta visas:
<foo a= "1 & 2 är < 3 
" />
och en XML-tolkare skulle tolka "a " -attributets värde som teckendata " 1 & 2 är <3 ".
Entitet av CDATA-typ
En SGML eller XML DTD kan också inkludera entitetsdeklarationer där token CDATA används för att indikera att entiteten består av teckendata. Teckendata kan förekomma i själva deklarationen eller kan vara tillgänglig externt, refererad till av en URI . I båda fallen är teckenreferens- och parameterentitetsreferensmarkering tillåten i entiteten och kommer att behandlas som sådan när den läses.
<DISPLAY_NAME Attribute= "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>