2009-05-13 9 views
26

es scheint, dass eine lose Definition von PCDATA und CDATA dass Zeichendatenwas ist eigentlich PCDATA und CDATA?

  1. PCDATA ist, aber ist analysiert werden.
  2. CDATA ist Zeichendaten, und wird nicht analysiert werden.

aber dann hat mir jemand gesagt, dass CDATA tatsächlich geparst wird oder PCDATA eigentlich nicht geparst wird ... also ist es ein bisschen verwirrend. Weiß jemand, dass das echte Geschäft ist?

Update: Ich habe tatsächlich die PCDATA Definition auf Wikipedia hinzugefügt ... also nehmen Sie diese Antwort nicht zu ernst, da das nur mein grobes Verständnis davon ist.

+0

Die Verwirrung kann durch die Tatsache verursacht werden, dass CDATA geparst werden kann, aber von einem anderen Parser. Zum Beispiel wird der Inhalt eines 'script' -Elements, das in HTML CDATA ist, vom Javascript-Interpreter analysiert. –

Antwort

22

Von WIKI:

PCDATA

Einfach gesagt, steht PCDATA für Parsed Zeichendaten. Das bedeutet, dass die Zeichen vom XML-, XHTML- oder HTML-Parser analysiert werden müssen. (&lt; wird in < geändert, <p> wird so verstanden, dass ein Absatz-Tag usw. gemeint ist). Vergleichen Sie das mit CDATA, wo die Zeichen nicht vom XML-, XHTML- oder HTML-Parser analysiert werden sollen.

CDATA

Der Begriff CDATA Zeichendaten bedeutet, für verschiedene verwendet wird, aber verwandte Zwecke in der Markup-Sprachen SGML und XML. Der Ausdruck gibt an, dass ein bestimmter Teil des Dokuments allgemeine Zeichendaten sind, und nicht Nicht-Zeichendaten oder Zeichendaten mit einer spezifischeren, begrenzten Struktur.

0

Ihre erste Definition ist richtig.

PCDATA wird analysiert, was bedeutet, dass Entitäten erweitert werden und dass Text als Markup behandelt wird. CDATA wird nicht von einem XML-Parser analysiert.

9

Sowohl PCDATA als auch CDATA werden analysiert. Sie sind beide Zeichen Daten.

Beide müssen nur gültige Zeichen enthalten. Wenn Ihre Dokumentcodierung beispielsweise UTF-8 ist, müssen die Inhalte von CDATA-Abschnitten weiterhin gültige UTF-8-Zeichen sein. Zufällige Binärdaten werden wahrscheinlich verhindern, dass das Dokument wohlgeformt wird. Auch CDATA-Abschnitte werden immer noch geparst, um nur das Endabschnitt-Tag zu finden. Aber andere Markup-ähnliche Zeichen, wie <,> und & werden ignoriert und unverändert vom Parser übergeben.

OTOH in PCDATA Litteral < und & (und 'oder "in Attributwerten) entwertet werden müssen, oder sie werden als Markup interpretiert werden. Entities werden auch erweitert werden.

Also ja, CDATA Abschnitte sind in der Tat geparst. Ich bin mir nicht sicher, warum Ihnen gesagt wurde, dass PCDATA nicht analysiert wird.

3
  • PCDATA ist ein Text, der von einem Parser analysiert wird. Tags innerhalb des Textes werden als Markup behandelt und Entitäten werden erweitert.
  • CDATA ist ein Text, der nicht von einem Parser analysiert werden soll. Tags innerhalb des Textes werden nicht als Markup behandelt und Entitäten werden nicht erweitert.

Standardmäßig ist alles PCDATA. Im folgenden Beispiel wird das Ignorieren des Stamms analysiert und es enthält keinen Inhalt, sondern nur ein Kind.

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

Wenn wir, dass ein Element angeben mögen nur Text enthält, und keine untergeordneten Elemente verwenden wir das Schlüsselwort PCDATA, weil dieses Schlüsselwort gibt an, dass das Element parsable Zeichendaten enthalten muss - das heißt, jeden Text, außer die Zeichen kleiner als (<), Größer als (>), kaufmännisches Und (&), Zitat (') und Anführungszeichen (").

Im nächsten Beispiel ist bar CDATA und wird nicht analysiert und hat den Inhalt "Inhalt!".

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

Es gibt verschiedene Inhaltsmodelle in SGML. Das #PCDATA-Inhaltsmodell besagt, dass ein Element reinen Text enthalten kann. Der "geparste" Teil bedeutet, dass Markup (einschließlich PIs, Kommentare und SGML-Anweisungen) darin analysiert und nicht als Rohtext angezeigt wird. Es bedeutet auch, dass Entity-Referenzen ersetzt werden.

Eine andere Art von Inhaltsmodell, das reinen Textinhalt erlaubt, ist CDATA. In XML muss das Elementinhaltsmodell nicht implizit auf CDATA festgelegt werden, aber in SGML bedeutet dies, dass Markup- und Entitätsreferenzen im Inhalt des Elements ignoriert werden. In Attributen vom CDATA-Typ werden Entitätsreferenzen jedoch ersetzt.

In XML #PCDATA ist das einzige reine Text-Content-Modell. Sie verwenden es, wenn Sie Textinhalte im Element überhaupt zulassen wollen. Das CDATA-Inhaltsmodell kann explizit über das CDATA-Block-Markup in #PCDATA verwendet werden, aber der Elementinhalt ist möglicherweise nicht standardmäßig als CDATA definiert.

In einer DTD muss der Typ eines Attributs, das Text enthält, CDATA sein. Das CDATA-Schlüsselwort in einer Attributdeklaration hat eine andere Bedeutung als der CDATA-Abschnitt in einem XML-Dokument. Im CDATA-Bereich sind alle Zeichen zulässig (einschließlich <,>, &, 'und' Zeichen) mit Ausnahme des Endzeichens "]]>".

#PCDATA ist nicht geeignet für den Typ eines Attributs. Es wird für den Typ des "Blatt" -Text verwendet.

#PCDATA wird nur aus historischen Gründen mit einem Hashtag vorangestellt.

0

Wenn nur Elemente in den XHTML-DTDs standardmäßig auf CDATA gesetzt würden, würde es eine Menge hässlicher manueller Überschreibungen speichern ... Warum würden Skriptblöcke andere Elemente enthalten? Wenn solche Elemente vorhanden sind, werden sie vom JS-Interpreter in DOM-Manipulationsaktionen gehandhabt - in diesem Fall sollten sie vom XML-Parser vor dem Einfügen und Rendern des Dokuments vollständig ignoriert werden. Ich nehme an, dass es möglicherweise entwickelt wurde, um die Verwendung externer Skript-Ressourcendateien zu erzwingen, was letztendlich eine gute Sache ist.