Ich muss den HTML-Inhalt von answer
in diesem XML-Bit erhalten:
Also möchte ich die Zeichenfolge "Wer wer, & lt; stark & gt; Wer, der & lt; / strong & gt;" & lt; em & gt; mich & lt; / em & gt; ".
Wenn ich answer
als SimpleXMLElement
habe, kann ich asXML()
aufrufen, um "& lt; answer & gt; Wer, & lt; strong & gt; wer? & lt; / strong & gt;, & lt; em & gt; me & lt; / em & gt; & lt; / answer & gt; ", aber wie erhält man das innere XML eines Elements, ohne dass das Element selbst darum gewickelt ist?
Ich bevorzuge Wege, die keine String-Funktionen beinhalten, aber wenn das der einzige Weg ist, dann sei es so.
Soweit ich weiß, gibt es keine integrierte Möglichkeit, das zu erreichen. Ich würde empfehlen, SimpleDOM zu versuchen. Dies ist eine PHP-Klasse, die SimpleXMLElement erweitert und bequeme Methoden für die meisten gängigen Probleme bietet.
%Vor% Ansonsten sehe ich zwei Möglichkeiten, das zu tun. Die erste wäre, Ihre SimpleXMLElement
in eine DOMNode
umzuwandeln und dann über ihre childNodes
zu schleifen, um die XML zu erstellen. Die andere wäre, asXML()
aufzurufen und dann String-Funktionen zu verwenden, um den Root-Knoten zu entfernen. Beachten Sie jedoch, dass asXML()
manchmal Markups zurückgeben kann, die tatsächlich außerhalb des Knotens sind, von dem es aufgerufen wurde, z. B. XML-Prolog oder Verarbeitungsbefehle.
Die einfachste Lösung ist die Implementierung von benutzerdefiniertem get innerXML mit einfachem XML:
%Vor% Ersetzen Sie in Ihrem Code $body_content = $el->asXml();
durch $body_content = simplexml_innerXML($el);
Sie können jedoch auch zu einer anderen API wechseln, die zwischen innerXML (was Sie suchen) und externalXML (was Sie für jetzt erhalten) unterscheidet. Microsoft Dom-Bibliothek bietet diese Unterscheidung, aber leider PHP DOM nicht.
Ich habe festgestellt, dass die PHP XMLReader API diese Unterscheidung bietet. Siehe readInnerXML (). Obwohl diese API einen ganz anderen Ansatz für die Verarbeitung von XML hat. Probieren Sie es aus.
Abschließend möchte ich betonen, dass XML nicht dazu dient, Daten als Teilbäume zu extrahieren, sondern als Wert. Aus diesem Grund haben Sie Probleme, die richtige API zu finden. Es wäre "Standard", den HTML-Teilbaum als Wert zu speichern (und alle Tags zu entkommen) anstatt als XML-Teilbaum. Beachten Sie auch, dass einige HTML-Synthax nicht immer XML-kompatibel sind (d. H.
vs,
). Wie auch immer, in der Praxis ist es für Sie einfacher, die XML-Datei zu bearbeiten.
Nachdem ich eine Weile gesucht habe, habe ich keine zufriedenstellende Lösung gefunden. Also habe ich meine eigene Funktion geschrieben.
Diese Funktion wird genau den innerXml
Inhalt erhalten (natürlich inklusive Leerzeichen).
Um es zu verwenden, übergeben Sie das Ergebnis der Funktion asXML()
, wie dieses getInnerXml($e->asXML())
. Diese Funktion funktioniert auch für Elemente mit vielen Präfixen (wie ich, da ich keine aktuellen Methoden finden konnte, die Konvertierung auf allen Kindknoten unterschiedlicher Präfixe durchführen).
Ausgabe:
%Vor%Wenn Sie den CDATA-Bereich nicht strippen wollen, kommentieren Sie die Zeilen 6-8 aus.
%Vor%