3 Stimmen

Schlecht geformtes XML kann nicht geparst werden

Ich habe versucht, die dieses Futter . Wenn Sie auf diesen Link klicken, werden Sie feststellen, dass er nicht einmal im Browser korrekt analysiert werden kann.

Wie auch immer, mein Hosting-Service lässt mich nicht simplexml_load_file verwenden, also habe ich cURL verwendet, um es dann laden die Zeichenfolge in den DOM, wie diese:

$dom = new DOMDocument;
$dom->loadXML($rawXML);
if (!$dom) {
 echo 'Error while parsing the document';
 exit;
}
$xml = simplexml_import_dom($dom);

Aber ich bekomme Fehler ("DOMDocument::loadXML() [domdocument.loadxml]: Entity 'nbsp' not defined in Entity"), dann habe ich versucht, mit SimpleXMLElement ohne Glück (es zeigt den gleichen Fehler "parser error : Entity 'nbsp' not defined", usw... wegen des HTML in diesem einen Element).

$xml = new SimpleXMLElement($rawXML);

Meine Frage ist also, wie kann ich dieses Element überspringen/ignorieren/entfernen, damit ich den Rest der Daten analysieren kann?


Edit: Danke an mjv für die Lösung!... Ich habe gerade dies getan (für andere, die das gleiche Problem haben)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);

5voto

meder omuraliev Punkte 177513

Wahrscheinlich müssen Sie den Quellcode mit etwas wie manipulieren:

$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
if ( $xml ) {
    $xml = preg_replace( '/&nbsp/', '&amp;nbsp', $xml );
    $xml = new SimpleXMLElement($xml);
    var_dump($xml);
}

Ich würde gerne einen anderen Weg empfehlen, aber ich denke, dass dies der einzige Weg ist, bevor ich es an einen XML-Parser weitergebe.

Edit: Ich glaube, Sie können tatsächlich ersetzen <description> con <description><![CDATA[ und so weiter:

<?php
$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
$xml = preg_replace( '/<description>/', '<description><![CDATA[', $xml );
$xml = preg_replace( '/<\/description>/', ']]></description>', $xml );
$xml = new SimpleXMLElement($xml);
var_dump($xml);

Sie müssen dies für jedes Element tun, das Zeichendaten enthält.

4voto

mjv Punkte 70143

Möglicherweise müssen Sie einen Pre-Parsing-Schritt einführen, der Folgendes hinzufügen würde

<![CDATA[

nach jedem <Beschreibung>-Tag
und hinzufügen

]]>

vor jedem </description>-Tag
Konkret (siehe meders Antwort für das entsprechende PHP-Snippet)

<description>blah <br />&nbsp; blah, blah...</description>
should become
<description><![CDATA[blah <br />&nbsp; blah, blah...]]></description>

Auf diese Weise würde der gesamte Inhalt des "decription"-Elements "escaped" werden, so dass jedes html- (oder sogar xhtml-) Konstrukt, das in diesem Element gefunden wird und die XML-Parsing-Logik auslösen könnte, ignoriert würde. Damit wäre das von Ihnen erwähnte   Problem gelöst, aber auch viele andere häufige Probleme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X