Wat doet <![CDATA[]]> in XML bedoel?

Ik vind vaak deze vreemde CDATA-tag in XML-bestanden:

<![CDATA[some stuff]]>

Ik heb gemerkt dat deze CDATA-tag altijd aan het begin komt, en dan gevolgd door wat dingen.

Maar soms wordt het gebruikt, soms niet. Ik neem aan dat het is om aan te geven dat some stuffde “gegevens” zijn die daarna worden ingevoegd. Maar wat voor soort gegevens zijn some stuff? Is alles wat ik schrijf in XML-tags niet een soort data?


Antwoord 1, autoriteit 100%

CDATAstaat voor Tekengegevensen het betekent dat de gegevens tussen deze strings gegevens bevatten die zou kunnenworden geïnterpreteerd als XML-opmaak, maar zou dat niet moeten zijn.

De belangrijkste verschillen tussen CDATA en opmerkingen zijn:

Dit betekent, gegeven deze vier XML-fragmenten uit één goed gevormd document:

<!ENTITY MyParamEntity "Has been expanded">

<!--
Within this comment I can use ]]>
and other reserved characters like <
&, ', and ", but %MyParamEntity; will not be expanded
(if I retrieve the text of this node it will contain
%MyParamEntity; and not "Has been expanded")
and I can't place two dashes next to each other.
-->

<![CDATA[
Within this Character Data block I can
use double dashes as much as I want (along with <, &, ', and ")
*and* %MyParamEntity; will be expanded to the text
"Has been expanded" ... however, I can't use
the CEND sequence. If I need to use CEND I must escape one of the
brackets or the greater-than sign using concatenated CDATA sections.
]]>

<description>An example of escaped CENDs</description>
<!-- This text contains a CEND ]]> -->
<!-- In this first case we put the ]] at the end of the first CDATA block
     and the > in the second CDATA block -->
<data><![CDATA[This text contains a CEND ]]]]><![CDATA[>]]></data>
<!-- In this second case we put a ] at the end of the first CDATA block
     and the ]> in the second CDATA block -->
<alternative><![CDATA[This text contains a CEND ]]]><![CDATA[]>]]></alternative>

Antwoord 2, Autoriteit 34%

Een CDATA-sectie is “een deel van elementinhoud dat is gemarkeerd voor de parser om te interpreteren als alleen tekengegevens , niet op markering.

syntactisch, het gedraagt ​​zich op dezelfde manier als een opmerking:

<exampleOfAComment>
<!--
    Since this is a comment
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well-formed!
-->
</exampleOfAComment>

… maar het is nog steeds deel uit van het document:

<exampleOfACDATA>
<![CDATA[
    Since this is a CDATA section
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well formed!
]]>
</exampleOfACDATA>

Probeer het volgende op te slaan als een .xhtmlbestand (niet .html) en open deze met Firefox (niet Internet Explorer ) om het verschil tussen de opmerking en het gedeelte CDATA te zien; De opmerking verschijnt niet wanneer u in een browser naar het document kijkt, terwijl het gedeelte CDATA:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
<head>
<title>CDATA Example</title>
</head>
<body>
<h2>Using a Comment</h2>
<div id="commentExample">
<!--
You won't see this in the document
and can use reserved characters like
< > & "
-->
</div>
<h2>Using a CDATA Section</h2>
<div id="cdataExample">
<![CDATA[
You will see this in the document
and can use reserved characters like
< > & "
]]>
</div>
</body>
</html>

iets om op te letten met CDATA-secties is dat ze geen codering hebben, dus er is geen manier om de string ]]>erin op te nemen. Alle tekengegevens die ]]>bevatten, moeten – voor zover ik weet – wees in plaats daarvan een tekstknooppunt. Evenzo, vanuit een DOM-manipulatie-perspectief kunt u geen CDATA-sectie maken die ]]>:

var myEl = xmlDoc.getElementById("cdata-wrapper");
myEl.appendChild(xmlDoc.createCDATASection("This section cannot contain ]]>"));

Deze DOM-manipulatiecode gooit een uitzondering (in Firefox) of resulteert in een slecht gestructureerd XML-document: http: / /jsfiddle.net/9nnha/


Antwoord 3, Autoriteit 7%

Eén groot gebruik-case: uw XML bevat een programma, zoals gegevens (bijvoorbeeld een webpagina-tutorial voor Java). In die situatie omvatten uw gegevens een groot stuk karakters met ‘& amp; en ‘& lt; Maar die karakters zijn niet bedoeld als XML.

Vergelijk:

<example-code>
while (x &lt; len &amp;&amp; !done) {
    print( &quot;Still working, &apos;zzz&apos;.&quot; );
    ++x;
    }
</example-code>

met

<example-code><![CDATA[
while (x < len && !done) {
    print( "Still working, 'zzzz'." );
    ++x;
    }
]]></example-code>

Vooral als u deze code wilt kopiëren / plakken in een bestand (of inclusief het, in een preprocessor), is het leuk om alleen de gewenste personages te hebben in uw XML-bestand, zonder verwarring te maken met XML-tags / attributen. Zoals @paarary vermeld, omvatten andere gemeenschappelijke toepassingen wanneer u URL’s inbeddaadt die ampersands bevatten. Ten slotte, zelfs als de gegevens alleen een paar speciale tekens bevatten, maar de gegevens heel erg lang zijn (de tekst van een hoofdstuk, zeggen), is het leuk om niet om die paar entiteiten niet te gebruiken, terwijl u uw XML-bestand bewerkt, omdat u uw XML-bestand bewerkt .

(Ik vermoed dat alle vergelijkingen op reacties zijn, is een beetje misleidend / nutteloos.)


Antwoord 4, Autoriteit 4%

Ik moest eens CDATA gebruiken wanneer mijn XML-element HTML-code op te slaan. Zoiets als

<codearea>
  <![CDATA[ 
  <div> <p> my para </p> </div> 
  ]]>
</codearea>

Dus CDATA betekent dat het elk personage zal negeren dat anders zou kunnen worden geïnterpreteerd als XML-tag zoals & LT; en en GT; enz.


Antwoord 5, Autoriteit 3%

De daarin vervatte gegevens worden niet geparseerd als XML, en hoeft als zodanig geen geldige XML te zijn of kan deze elementen bevatten die xml kunnen zijn, maar niet.


Antwoord 6, Autoriteit 2%

Als een ander voorbeeld van het gebruik ervan:

Als u een RSS-feed (XML-document) hebt en een standaard HTML-codering wilt opnemen in het display van de beschrijving, kunt u CDATA gebruiken om deze te coderen:

<item>
  <title>Title of Feed Item</title>
  <link>/mylink/article1</link>
  <description>
    <![CDATA[
      <p>
      <a href="/mylink/article1"><img style="float: left; margin-right: 5px;" height="80" src="/mylink/image" alt=""/></a>
      Author Names
      <br/><em>Date</em>
      <br/>Paragraph of text describing the article to be displayed</p>
    ]]>
  </description>
</item>

De RSS-lezer haalt de beschrijving op en geeft de HTML weer in de CDATA.

Opmerking – niet alle HTML-tags werken – ik denk dat dit afhangt van de RSS-lezer die u gebruikt.


En als verklaring waarom dit voorbeeld CData gebruikt (en niet de juiste pubData- en dc:creator-tags): dit is voor websiteweergave met een RSS-widget waarvoor we geen echte opmaakcontrole hebben.

Hierdoor kunnen we de hoogte en positie van de opgenomen afbeelding specificeren, de auteursnamen en datum correct opmaken, enzovoort, zonder dat er een nieuwe widget nodig is. Het betekent ook dat ik dit kan scripten en niet handmatig hoef toe te voegen.


Antwoord 7, autoriteit 2%

Van Wikipedia:

[In] een XML-document of een externe geparseerde entiteit is een CDATA-sectie een
sectie van elementinhoud die is gemarkeerd voor de parser om te interpreteren
als alleen tekengegevens, niet als markeringen.

http://en.wikipedia.org/wiki/CDATA

Dus: tekst in CDATA wordt door de parser gezien, maar alleen als tekens en niet als XML-knooppunten.


Antwoord 8

CDATA staat voor Character Data. U kunt dit gebruiken om enkele tekens te escapen die anders als gewone XML worden behandeld. De gegevens hierin worden niet geparseerd.
Als u bijvoorbeeld een URL wilt doorgeven die &bevat, kunt u hiervoor CDATA gebruiken. Anders krijg je een foutmelding omdat het wordt geparseerd als gewone XML.


Antwoord 9

Het ontsnapt aan een tekenreeks die niet zoals gewoonlijk aan XML kan worden doorgegeven:

Voorbeeld:

De tekenreeks bevat “&” erin.

Je kunt niet:

<FL val="Company Name">Dolce & Gabbana</FL>

Daarom moet u CDATA gebruiken:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>

Antwoord 10

Het wordt gebruikt om gegevens te bevatten die anders als XML zouden kunnen worden gezien omdat het bepaalde tekens bevat.

Op deze manier worden de gegevens erin weergegeven, maar niet geïnterpreteerd.


Antwoord 11

De Cdata is een data die je misschien wilt doorgeven aan een xml-parser en nog steeds niet geïnterpreteerd als een xml.

Zeg bijvoorbeeld: – Je hebt een xml die een vraag/antwoord-object bevat. Dergelijke open velden kunnen alle gegevens bevatten die niet strikt onder het basisgegevenstype of xml-gedefinieerde aangepaste gegevenstypen vallen. Like —Is dit een correcte tag voor xml-commentaar?.–
Mogelijk hebt u een vereiste om het door te geven zoals het is zonder dat het door de xml-parser wordt geïnterpreteerd als een ander onderliggend element. Hier komt Cdata je te hulp. Door te declareren als Cdata, vertel je de parser dat de gegevens die zijn verpakt als een xml niet moeten worden behandeld (hoewel het er misschien zo uitziet)


Antwoord 12

Meestal gebruikt voor het insluiten van aangepaste gegevens, zoals afbeeldingen of geluidsgegevens in een XML-document.


Antwoord 13

Merk op dat de constructie CDATAalleen nodig is als tekst rechtstreeks in het XML-tekstbestand wordt geplaatst.

Dat wil zeggen, u hoeft alleen CDATAte gebruiken als u met de hand typt of de XML-tekst rechtstreeks programmatisch opbouwt.

Elke tekst die wordt ingevoerd met behulp van een DOM-processor-API of SimpleXML wordt automatisch ontsnapt om te voorkomen dat de XML-inhoudsregels worden overtreden.

Desalniettemin kunnen er momenten zijn waarop het gebruik van CDATAde tekstgrootte kan verkleinen die anders zou worden geproduceerd met alle entiteiten gecodeerd, zoals voor css in style-tags of javascript in script-tags, waarbij veel taalconstructies tekens in HTML|XML gebruiken, zoals <en >.

Other episodes