dedlfix: + PHP: kleiner < und größer >

Beitrag lesen

echo $begrüßung;

Fangen wir von vorne an: Ich baue mir mit Hilfe von DOMImplementation von PHP ein XML-Dokument in UTF-8. Damit auch jeder Inhalt der erstellten XML-Tags akzeptiert werden, muss ich sie maskieren, mittels htmlentites (sorry, ein anderer Weg ist mir grad nicht eingefallen).

Nein, das ist nicht notwendig, da die notwendigen Maskierungen von den DOM-Funktionen selbst vorgenommen werden. Du übergibst einfach nur reinen Text in dem dafür vorgesehenen Parameter.
htmlentities() ist auch die falsche Funktion, da XML nur für die 5 Zeichen & < > " ' Entities deklariert. Aber egal, ob du nun htmlentities() oder htmlspecialchars() verwendest, wird das Ergebnis von den DOM-Funktionen als reiner Text interpretiert und das einleitende & erneut maskiert.

Bei Anwendung von saveXML() - also den generierten Baum als String speichern, werden scheinbar < und >, die im normalen Text enthalten sind, automatisch maskiert.

Nicht nur scheinbar, das ist definiertes Verhalten.

Das sind übrigens öffnende und schließende HTML-Tags, die mittels eines Editors eingegeben wurden -> d.h. Wohlgeformtheit bleibt erhalten. Ich weiß ganz genau, ich habe sie nicht maskiert. Um sie wieder zu ordentlichen Tags zu machen, muss ich sie mit html_entity_decode wieder umwandeln.

Das heißt also, du möchtest diese Eingabe nicht als reinen Text betrachten sondern als XML-Fragment? Dann musst du das auch so bekanntgeben und DOMDocumentFragment->appendXML() benutzen.

Dummerweise werden auf diesem Weg auch die einfachen größer und kleiner im Text (" 1 < 2 < 3 > 2 > 1") wieder zurück verwandelt.

Anhand welcher Kriterien soll man denn, wenn man ein dummer Computer ist, unterscheiden, ob ein < nun die Einleitung eines Tags ist oder ein Text-Bestandteil? Oder andersrum, dass das eine &amp; zu einen Tag-Einleitung und das andere &amp; zu einem Textzeichen umzukodieren ist?

Beim Laden des XML-Strings in ein neues XML-Dokument mittels new DomDocument und loadXML() sagt der:
Warning: DOMDocument::loadXML(): xmlParseEntityRef: no name in Entity,
DOMDocument::loadXML(): StartTag: invalid element name in Entity

Das wird eines der in HTML aber nicht in XML vorhandenen Entities sein.

echo "$verabschiedung $name";