it-swarm.com.de

Selbstschließende Tags in XML-Dateien

<tag id="foo" />

Mir ist aufgefallen, dass sie mit PHP SimpleXML arbeiten.

Alle XML-Beispiele, die ich im Web gefunden habe, schließen sie auf die alte Weise:

<tag id="foo"></tag>

Gibt es einen Grund, warum ich die alte Methode verwenden sollte?

22
Natasha

Siehe die W3C-Spezifikationen für XML und XHTML:

Dies hängt von der Elementtyp-Deklaration ab

Ein Element ohne Inhalt soll leer sein. Die Darstellung eines leeren Elements ist entweder ein Start-Tag, unmittelbar gefolgt von einem End-Tag, oder ein Tag für leere Elemente.

aber auch

Tags mit leeren Elementen können für jedes Element verwendet werden, das keinen Inhalt hat, unabhängig davon, ob es mit dem Schlüsselwort EMPTY deklariert wurde oder nicht. Für die Interoperabilität SOLLTE das Leerelement-Tag verwendet werden, und SOLLTE nur für Elemente verwendet werden, die als LEER deklariert sind.

Dies bedeutet, wenn Ihre DTD so etwas enthält

<!ELEMENT img EMPTY>

sie sollten verwenden

<img/>

es sei denn, Sie haben guten Grund zu verwenden

<img></img>

Beachten Sie, dass SOLLTE in RFC2119 definiert sein als

Dieses Wort oder das Adjektiv "EMPFOHLEN" bedeutet, dass es unter bestimmten Umständen triftige Gründe geben kann, einen bestimmten Punkt zu ignorieren. Die vollständigen Auswirkungen müssen jedoch verstanden und sorgfältig abgewogen werden, bevor ein anderer Kurs gewählt wird.

Wenn Sie mit XML ohne DTD oder Schema arbeiten, können Sie auch mit einer vordefinierte libxml-Konstante beeinflussen, wie das XML serialisiert wird:

LIBXML_NOEMPTYTAG (Ganzzahl): Leere Tags erweitern (z. B. <br/> bis <br></br>)

Beachten Sie jedoch, dass diese Option derzeit nur in den Funktionen DOMDocument::save und DOMDocument::saveXML verfügbar ist, sodass Sie sie nicht mit SimpleXml verwenden können.

25
Gordon

Wenn Sie den xml-Parser von PHP verwenden möchten, können Sie Aktionen bei einem Starttag, einem Close-Tag oder einem vollständigen Tag angeben. Je nach Ihren Wünschen möchten Sie möglicherweise eine Aktion speziell für das close-Tag durchführen.

2
y_a_v_a

In bestimmten Fällen sind separate Open/Close-Tags erforderlich: Als Beispiel habe ich festgestellt, dass <Script> -Tags in HTML ein separates Öffnen/Schließen benötigen, um in einigen Browsern konsistent zu arbeiten. Das separate Öffnen/Schließen ist etwas ausführlicher, lohnt sich aber in diesen Fällen.

1
Femi

Sie sind für XML gleich, können jedoch je nach Verwendung unterschiedlich sein. In xhtml1.0 gibt es beispielsweise eine offizielle Liste für Tags, die sich selbst schließen können. Solange Sie Ihren Doctype auf dem richtigen xhtml-Typ beibehalten, sollte es Ihnen gut gehen. Check out diese Frage von stackoverflow für eine detailliertere Erklärung.

1
Lars

Ja, es ist nicht so einfach, wie es auf den ersten Blick scheint.

XSD-Unterschiede:

Zunächst hängt es von Ihrem Datentyp ab. Wenn Sie eine XSD-Schemadefinition verwenden, die die Typen Ihrer Elemente definiert, kann <element></element>eigentlich nur für String-Typen verwendet werden. Weil es das ist, ist es tatsächlich ein leerer String-Wert: "".

Daher ist es nicht zulässig, <element></element> für eine ganze Zahl zu verwenden, während <element/> für alle einfachen Typen gilt.

JAXB Unterschiede:

JAXB (Java XML Binding) hat ähnliche Macken. Es würde <element/> als verschiedene Werte abbilden, abhängig vom Zieldatentyp:

  • für String wäre es ein ""
  • für Ganzzahl wäre es eine 0.
  • für andere Typen würde es einfach überspringen.

Sie könnten versucht sein zu glauben, dass <element/> zu einem null-Wert aufgelöst würde. Dafür müssen Sie jedoch <element xsi:nil="true"/> verwenden. Was ich noch nie in der Praxis gesehen habe.

HTML:

In HTML gibt es immer die dritte Option von <element>, ohne Tag zu schließen. Ich weiß nicht wie es Ihnen geht, aber ich muss mich mehrmals am Tag daran erinnern, dass HTML nicht nur XML ist. Und das bedeutet eigentlich, dass <br> und <br/> nicht dasselbe sind. Sie sollten <br/> nicht in HTML und nicht <br> in XHTML verwenden.

Winkel 2+:

Aber was ich wirklich wollte, möchte ich mit der letzten Aussage fortfahren. Wenn Sie Frameworks wie Angular2 + verwenden, ist eine andere Sache zu beachten. 

Ohne zu viel im Detail zu tauchen, ersetzt Angular benutzerdefinierte HTML-Tags durch HTML-Vorlagen, die mit Komponenten verknüpft sind. Unterstützt jedoch nur das <element></element>-Format. Das <element/>-Format darf nicht verwendet werden.

Ich persönlich versuche, die <element/>-Syntax zu vermeiden, da sie alle Möglichkeiten hat, die Dinge falsch laufen zu lassen. (= schlechtes aji ).

0
bvdb