Was bedeutet die eigenständige Direktive in XML?

272

Was bedeutet die ' standalone' Direktive in einem XML-Dokument?

Nick
quelle

Antworten:

203

Mit der standaloneDeklaration wird der Parser angewiesen, alle Markup-Deklarationen in der DTD zu ignorieren . Die DTD wird danach nur noch zur Validierung verwendet.

Betrachten Sie als Beispiel das bescheidene <img>Tag. Wenn Sie sich die XHTML 1.0-DTD ansehen , sehen Sie eine Markup-Deklaration, die dem Parser mitteilt, dass <img>Tags leer sein und Besitz srcund altAttribute haben müssen. Wenn ein Browser ein XHTML 1.0-Dokument durchläuft und ein <img>Tag findet, sollte er beachten, dass die DTD Anforderungen srcund altAttribute benötigt , und diese hinzufügen, wenn sie nicht vorhanden sind. Das <img>Tag wird auch selbst geschlossen, da es leer sein soll. Dies bedeutet die XML-Spezifikation unter "Markup-Deklarationen können sich auf den Inhalt des Dokuments auswirken". Sie können dann die standaloneDeklaration verwenden, um den Parser anzuweisen, diese Regeln zu ignorieren.

Ob Ihr Parser dies tatsächlich tut oder nicht, ist eine andere Frage, aber ein standardkonformer validierender Parser (wie ein Browser) sollte dies tun.

Wenn Sie keine DTD angeben, hat die eigenständige Deklaration "keine Bedeutung". Es gibt also keinen Grund, sie zu verwenden, es sei denn, Sie geben auch eine DTD an.

Nullfähigkeit
quelle
9
Das Beispiel muss weiter geändert werden. "Standalone = 'no'" würde normalerweise nicht geschlossene XML-Tags nicht schließen (dies ist eine Funktion von SGML, aber nicht von XML). Die Validierung schlägt fehl. Es werden auch keine Werte für Attribute bereitgestellt, die ERFORDERLICH sind.
Khaemuaset
2
"Die eigenständige Deklaration ist eine Möglichkeit, den Parser anzuweisen, Markup-Deklarationen in der DTD zu ignorieren." Das ist nicht korrekt. Mit standalone=yeswerden Markup-Deklarationen nicht ignoriert, sondern führen dazu, dass das Dokument ungültiges XML ist. Würde es Ihnen etwas ausmachen, wenn ich das in die Antwort einbaue?
Sleske
@sleske Bitte nehmen Sie einfach die Änderung vor. Der Autor kann jederzeit zurückkehren, wenn er nicht glücklich ist.
Stephan
@Stephan: Danke für die Ermutigung. Leider bin ich in Bezug auf das gesamte XML-Material nicht mehr auf dem neuesten Stand, sodass ich es momentan nicht sicher bearbeiten kann. Fühlen Sie sich frei, sich selbst zu bearbeiten, wenn Sie aktuelle Kenntnisse haben :-).
Sleske
106
  • Die eigenständige Direktive ist ein optionales Attribut in der XML-Deklaration.
  • Gültige Werte sind yes und no, wobei noder Standardwert ist.
  • Das Attribut ist nur relevant, wenn eine DTD verwendet wird. (Das Attribut ist bei Verwendung von a irrelevant Schema anstelle einer DTD verwendet wird.)
  • standalone="yes" bedeutet, dass der XML-Prozessor die DTD nur zur Validierung verwenden darf.In diesem Fall wird es nicht verwendet für:
    • Standardwerte für Attribute
    • Entitätserklärungen
    • Normalisierung
  • Beachten Sie, dass dies zu standalone="yes"Gültigkeitsbeschränkungen führen kann, wenn das Dokument eine externe DTD verwendet. Wenn das Dokument Dinge enthält, die eine Änderung des XML erfordern würden, z. B. Standardwerte für Attribute, und standalone="yes"verwendet wird, ist das Dokument ungültig .
  • standalone="yes" kann helfen, die Leistung der Dokumentverarbeitung zu optimieren.

Quelle: Das eigenständige Pseudoattribut ist nur relevant, wenn eine DTD verwendet wird

Rinke
quelle
2
Die Verwendung von Standalone = "yes" führt zu zusätzlichen Gültigkeitsbeschränkungen (dh kann dazu führen, dass ein XML-Dokument ungültig wird). Ich habe dies in die Antwort umgewandelt, hoffe das ist ok.
Sleske
2
@sleske Danke für deinen Beitrag. Ich habe versucht, Ihre Bearbeitung zu vereinfachen, während ich Ihren Standpunkt immer noch klar darlegte. Fühlen Sie sich frei, erneut zu bearbeiten, wenn ich etwas falsch gemacht habe.
Rinke
20

standalone beschreibt, ob das aktuelle XML-Dokument von einer externen Markup-Deklaration abhängt.

W3C beschreibt seinen Zweck in "Extensible Markup Language (XML) 1.0 (Fifth Edition)":

Stefan Gehrig
quelle
10

Markup-Deklarationen können sich auf den Inhalt des Dokuments auswirken, das von einem XML-Prozessor an eine Anwendung übergeben wird. Beispiele sind Attributvorgaben und Entitätsdeklarationen. Die eigenständige Dokumentdeklaration, die als Bestandteil der XML-Deklaration angezeigt werden kann, signalisiert, ob solche Deklarationen außerhalb der Dokumententität oder in Parameterentitäten vorhanden sind. [Definition: Eine externe Markup-Deklaration ist definiert als eine Markup-Deklaration, die in der externen Teilmenge oder in einer Parameterentität auftritt (extern oder intern, wobei letztere enthalten ist, da nicht validierende Prozessoren diese nicht lesen müssen).]

http://www.w3.org/TR/xml/#sec-rmd

Chris Diver
quelle
12
Was bedeutet das?
Dan Carter
4
Ich habe abgelehnt, da dies für normale Menschen mit mittlerem QI verständlich sein sollte.
Andrea Silvestri
8

Die Absicht der standalone=yes Erklärung soll sichergestellt werden, dass die Informationen im Dokument nur auf der Grundlage der internen DTD zuverlässig abgerufen werden können, dh das Dokument kann ohne externe Referenzen "eigenständig" sein. Durch die Validierung eines eigenständigen Dokuments wird sichergestellt, dass nicht validierende Prozessoren über alle Informationen verfügen, um das Dokument korrekt zu analysieren.

Die eigenständige Deklaration hat keinen Zweck, wenn ein Dokument keine externe DTD enthält und die interne DTD keine Verweise auf Parameterentitäten enthält, da diese Dokumente bereits implizit eigenständig sind.

Im Folgenden sind die tatsächlichen Auswirkungen der Verwendung aufgeführt standalone=yes.

  • Erzwingt, dass Prozessoren beim Parsen von Dokumenten mit einer externen DTD oder Parameterentitätsreferenzen einen Fehler auslösen, wenn das Dokument Verweise auf Entitäten enthält, die nicht in der internen DTD deklariert sind (mit Ausnahme des Ersatztextes von Parameterentitäten, die nicht validierende Prozessoren benötigen) analysiere dies); amp, lt, gt, apos, Und quotsind die einzigen Ausnahmen

  • Wenn ein nicht als eigenständig deklariertes Dokument analysiert wird, kann ein nicht validierender Prozessor das Parsen der internen DTD beenden, sobald er auf eine Parameterentitätsreferenz stößt. Wenn Sie ein Dokument als eigenständig deklarieren, werden nicht validierende Prozessoren gezwungen, Markup-Deklarationen in der internen DTD zu analysieren, selbst nachdem sie eine oder mehrere Parameterentitätsreferenzen ignoriert haben.

  • Erzwingt die Validierung von Prozessoren, um einen Fehler auszulösen, wenn im Dokument eine der folgenden Angaben gefunden wird und ihre jeweiligen Deklarationen in der externen DTD oder im Text zum Ersetzen von Parameterentitäten enthalten sind:

    • Attribute mit Standardwerten, wenn ihr Wert nicht explizit angegeben wurde
    • Entitätsverweise (außer amp, lt, gt, apos, und quot)
    • Attribute mit Token-Typen, wenn der Wert des Attributs durch Normalisierung geändert würde
    • Elemente mit Elementinhalt, wenn in ihrem Inhalt Leerzeichen auftreten

Ein nicht validierender Prozessor könnte in Betracht ziehen, die externe DTD abzurufen und alle Parameterentitätsreferenzen für Dokumente zu erweitern, die nicht eigenständig sind, obwohl er nicht dazu verpflichtet ist. Das heißt, die Einstellung standalone=yeskönnte theoretisch die Leistung für nicht validierende Prozessoren verbessern (Spoiler-Warnung: es wird wahrscheinlich keinen Unterschied machen).


Die anderen Antworten hier sind entweder unvollständig oder falsch, das Hauptmissverständnis ist das

Die eigenständige Deklaration weist den Parser an, alle Markup-Deklarationen in der DTD zu ignorieren. Die DTD wird danach nur noch zur Validierung verwendet.

standalone = "yes" bedeutet, dass der XML-Prozessor die DTD nur zur Validierung verwenden darf.

Im Gegenteil, wenn Sie ein Dokument als eigenständig deklarieren, wird ein nicht validierender Prozessor gezwungen, interne Deklarationen zu analysieren, die er normalerweise ignorieren muss (dh diejenigen nach einer ignorierten Parameterentitätsreferenz). Nicht validierende Prozessoren müssen weiterhin die Informationen in der internen DTD verwenden, um Standardattributwerte bereitzustellen und tokenisierte Attribute zu normalisieren, da dies unabhängig von der Validierung ist.

user657267
quelle