PHP SimpleXML erhalten Sie innerXML

8

Ich muss den HTML-Inhalt von answer in diesem XML-Bit erhalten:

%Vor%

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.

    
Bart van Heukelom 20.12.2009, 21:10
quelle

10 Antworten

5

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.

    
Josh Davis 21.12.2009, 03:22
quelle
12
%Vor%     
CrMosk 20.08.2011 01:33
quelle
5

Das funktioniert (obwohl es wirklich lahm aussieht):

%Vor%     
scrooloose 02.09.2010 04:05
quelle
4

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.

    
Frederic Bazin 13.06.2011 05:44
quelle
1

Ich hätte die SimpleXmlElement-Klasse erweitert:

%Vor%

und benutze es dann so:

%Vor%     
lingtalfi 24.08.2012 08:26
quelle
0
%Vor%

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%     
user1240602 29.02.2012 15:30
quelle
0
%Vor%     
Adam Lenda 04.10.2013 19:12
quelle
0

Wenn Sie den CDATA-Bereich nicht strippen wollen, kommentieren Sie die Zeilen 6-8 aus.

%Vor%     
Pavel Sedek 20.03.2014 01:30
quelle
0

Sie können einfach diese Funktion verwenden:)

%Vor%     
quelle
-2

mit Regex können Sie dies tun

%Vor%     
streetparade 20.12.2009 21:17
quelle

Tags und Links