Unterschied zwischen PCDATA und CDATA in der DTD

86

Was ist der Unterschied zwischen #PCDATAund #CDATAin der DTD ?

Jakub Arnold
quelle
1
Mögliches Duplikat von PCDATA und CDATA?
Joshua Drake
Die Namen der in XML-DTDs verwendeten Schlüsselwörter sind #PCDATAund CDATA. Es gibt kein PCDATASchlüsselwort und nein #CDATA.
mzjn
1
Zusätzlich zur akzeptierten Antwort sollten Sie stackoverflow.com/a/918462/2013911 lesen, da hier der Unterschied zwischen dem CDATA-Attributtyp und den mit <! [CDATA []]> markierten Abschnitten erläutert wird.
Niklas Peter

Antworten:

75

PCDATA - Analysierte Zeichendaten

XML-Parser analysieren normalerweise den gesamten Text in einem XML-Dokument.

CDATA - (nicht analysierte) Zeichendaten

Der Begriff CDATA wird für Textdaten verwendet, die vom XML-Parser nicht analysiert werden sollten.

Zeichen wie "<" und "&" sind in XML-Elementen unzulässig.

Matthew Vines
quelle
76
  • PCDATAist Text, der von einem Parser analysiert wird. Tags im Text werden als Markup behandelt und Entitäten werden erweitert.
  • CDATAist Text, der von einem Parser nicht analysiert wird. Tags im Text werden nicht als Markup behandelt und Entitäten werden nicht erweitert.

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

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

Wenn wir angeben möchten, dass ein Element nur Text und keine PCDATAuntergeordneten Elemente enthält, verwenden wir das Schlüsselwort , da dieses Schlüsselwort angibt, dass das Element analysierbare Zeichendaten enthalten muss, dh jeden Text mit Ausnahme der Zeichen kleiner als ( <). Größer als ( >), kaufmännisches Und ( &), Anführungszeichen ( ') und Anführungszeichen ( ").

Im nächsten Beispiel <bar>enthält CDATA. Sein Inhalt wird nicht analysiert und ist somit <test>content!</test>.

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

In SGML gibt es mehrere Inhaltsmodelle. Das #PCDATAInhaltsmodell besagt, dass ein Element einfachen Text enthalten kann. Der "analysierte" Teil davon bedeutet, dass Markups (einschließlich PIs, Kommentare und SGML-Anweisungen) darin analysiert werden, anstatt als Rohtext angezeigt zu werden. Dies bedeutet auch, dass Entitätsreferenzen ersetzt werden.

Eine andere Art von Inhaltsmodell, das Nur-Text-Inhalte zulässt, ist CDATA. In XML ist das Elementinhaltsmodell möglicherweise nicht implizit auf festgelegt. CDATAIn SGML bedeutet dies jedoch, dass Markup- und Entitätsreferenzen im Inhalt des Elements ignoriert werden. In Attributen vom CDATATyp werden jedoch Entitätsreferenzen ersetzt.

In XML #PCDATAist dies das einzige Nur-Text-Inhaltsmodell. Sie verwenden es, wenn Sie überhaupt Textinhalte im Element zulassen möchten. Das CDATAInhaltsmodell kann explizit über das CDATABlock-Markup in verwendet werden #PCDATA, der Elementinhalt ist jedoch möglicherweise nicht CDATAstandardmäßig definiert .

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

#PCDATAist für den Typ eines Attributs nicht geeignet. Es wird für die Art des "Blatt" -Textes verwendet.

#PCDATAwird im Inhaltsmodell durch einen Hash vorangestellt, um dieses Schlüsselwort von einem Element mit dem Namen zu unterscheiden PCDATA(was vollkommen legal wäre).

Rose Perrone
quelle
6
Tolle Antwort, bis auf den letzten Satz. #ist kein Hashtag. Nur ein Tag, dem dieses Symbol vorangestellt ist, ist ein Hashtag. Das Symbol selbst hat viele Namen , einschließlich "Nummernzeichen", "Nummernzeichen" (meistens Kanada und USA) oder einfach "Hash" (daher der Name "Hashtag").
6
#justhadtogetthatoffmychest
3
Ich bin nicht der Meinung, dass das # vor aus #PCDATAhistorischen Gründen vorhanden ist. Es ist da, weil in einer DTD ein Element auch ein Element mit dem Namen enthalten könnte PCDATA, das möglich sein muss und wie es aussehen würde <!ELEMENT foo (PCDATA)>.
Mathias Müller
Zitat und doppeltes Zitat sind in PCDATA-Inhalten vollkommen legal. Und kaufmännisches Und wird möglicherweise angezeigt, jedoch (in XML) nur als Entity-Einführer.
Toby Speight
12

PCDATA - analysierte Zeichendaten. Es analysiert alle Daten in einem XML-Dokument.

Beispiel:

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

Hier <family>enthält das Element 2 weitere Elemente: <mother>und <father>. Es wird also weiter analysiert, um den Text von Mutter und Vater dazu zu bringen, den Textwert der Familie als „Mama, Papa“ anzugeben.

CDATA - nicht analysierte Zeichendaten. Dies sind die Daten, die in einem XML-Dokument nicht weiter analysiert werden sollten.

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

Hier wird der Textwert der Familie sein <mother>mom</mother><father>dad</father>.

Fingerabdrücke
quelle
11

Von hier aus ( Google ist dein Freund ):

In einer DTD werden PCDATA und CDATA verwendet, um etwas über den zulässigen Inhalt von Elementen bzw. Attributen zu behaupten. Im Inhaltsmodell eines Elements sagt #PCDATA, dass das Element "jeden alten Text" enthält (möglicherweise enthält). (Mit den unten angegebenen Ausnahmen.) In der Deklaration eines Attributs ist CDATA eine Art von Einschränkung, die Sie für die zulässigen Werte des Attributs festlegen können (andere Arten, die sich alle gegenseitig ausschließen, umfassen ID, IDREF und NMTOKEN). Ein Attribut, dessen zulässige Werte CDATA sind, kann (wie PCDATA in einem Element) "jeden alten Text" enthalten.

Ein möglicherweise wirklich verwirrendes Problem ist, dass es eine weitere "CDATA" gibt, die auch als markierte Abschnitte bezeichnet wird. Ein markierter Abschnitt ist ein Teil des Elementinhalts (#PCDATA), der durch spezielle Zeichenfolgen begrenzt ist: um ihn zu schließen. Wenn Sie sich daran erinnern, dass PCDATA "analysierte Zeichendaten" sind, ist ein CDATA-Abschnitt buchstäblich dasselbe, ohne das "analysierte". Parser übertragen den Inhalt eines markierten Abschnitts an nachgeschaltete Anwendungen, ohne jedes Mal Schluckauf zu haben, wenn sie auf Sonderzeichen wie <und & stoßen. Dies ist nützlich, wenn Sie ein Dokument codieren, das viele dieser Sonderzeichen enthält (z. B. Skripte und Codefragmente). Es ist einfacher bei der Dateneingabe und beim Lesen als die entsprechende Entitätsreferenz.

Sie können also schließen, dass die Ausnahme von der Regel "Jeder alte Text" darin besteht, dass PCDATA keines dieser nicht entkoppelten Sonderzeichen enthalten darf, es sei denn, sie fallen in den Geltungsbereich eines mit CDATA gekennzeichneten Abschnitts.

Oli
quelle
3

Der Hauptunterschied zwischen PCDATA und CDATA ist

PCDATA - Wird grundsätzlich für ELEMENTE verwendet

CDATA - Wird für Attribute von XML verwendet, dh ATTLIST

Rachana K.
quelle
0

CDATA ( C haracter DATA ): Es ähnelt einem Kommentar, ist jedoch Teil des Dokuments. dh CDATA sind Daten, sie sind Teil des Dokuments, aber die Daten können nicht in XML analysiert werden.
Hinweis: Beim Parsen eines XML wird der XML-Kommentar weggelassen, CDATA wird jedoch so angezeigt, wie er ist.

PCDATA ( P arsed C haracter DATA ): Standardmäßig ist alles PCDATA. PCDATA sind Daten, die in XML analysiert werden können.

Premraj
quelle