PROBLEM
- Die PHP-Funktion
simplexml_load_file
löst parser
error : xmlParseEntityRef
beim Laden der XML-Datei von einer URL einen Analysefehler aus.
URSACHE
- Von der URL zurückgegebenes XML ist kein gültiges XML. Es enthält
&
Wert anstelle von &
. Es ist durchaus möglich, dass es andere Fehler gibt, die zu diesem Zeitpunkt nicht offensichtlich sind.
DINGE AUS UNSERER KONTROLLE
- Im Idealfall sollten wir sicherstellen, dass ein gültiges XML in die PHP-
simplexml_load_file
Funktion eingespeist wird, aber es sieht so aus, als hätten wir keine Kontrolle darüber, wie das XML erstellt wird.
- Es ist auch nicht möglich,
simplexml_load_file
die Verarbeitung einer ungültigen XML-Datei zu erzwingen . Es bleiben uns nicht viele Optionen, außer die XML-Datei selbst zu reparieren.
MÖGLICHE LÖSUNG
Konvertieren Sie ungültiges XML in gültiges XML. Dies kann mit erfolgen PHP tidy extension
. Weitere Anweisungen finden Sie unter http://php.net/manual/en/book.tidy.php
Wenn Sie sicher sind, dass die Erweiterung vorhanden oder installiert ist, gehen Sie wie folgt vor.
/**
* As per the question asked, the URL is loaded into a variable first,
* which we can assume to be $xml
*/
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
<invalid-data>Some other data containing & in it</invalid-data>
<unclosed-tag>
</project>
XML;
/**
* Whenever we use tidy it is best to pass some configuration options
* similar to $tidyConfig. In this particular case we are making sure that
* tidy understands that our input and output is XML.
*/
$tidyConfig = array (
'indent' => true,
'input-xml' => true,
'output-xml' => true,
'wrap' => 200
);
/**
* Now we can use tidy to parse the string and then repair it.
*/
$tidy = new tidy;
$tidy->parseString($xml, $tidyConfig, 'utf8');
$tidy->cleanRepair();
/**
* If we try to output the repaired XML string by echoing $tidy it should look like.
<?xml version="1.0" encoding="utf-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
<invalid-data>Some other data containing & in it</invalid-data>
<unclosed-tag></unclosed-tag>
</project>
* As you can see that & is now fixed in campaign_name attribute
* and also with-in invalid-data element. You can also see that the
* <unclosed-tag> which didn't had a close tag, has been fixed too.
*/
echo $tidy;
/**
* Now when we try to use simplexml_load_string to load the clean XML. When we
* try to print_r it should look something like below.
SimpleXMLElement Object
(
[@attributes] => Array
(
[orderno] => 6
[campaign_name] => International Relief & Development for under developed nations
)
[invalid-data] => Some other data containing & in it
[unclosed-tag] => SimpleXMLElement Object
(
)
)
*/
$simpleXmlElement = simplexml_load_string($tidy);
print_r($simpleXmlElement);
VORSICHT
Der Entwickler sollte versuchen, das ungültige XML mit einem gültigen XML (generiert von tidy) zu vergleichen, um festzustellen, dass nach der Verwendung von tidy keine nachteiligen Nebenwirkungen auftreten. Tidy macht einen extrem guten Job, um es richtig zu machen, aber es tut nie weh, es visuell zu sehen und 100% sicher zu sein. In unserem Fall sollte es so einfach sein, $ xml mit $ tidy zu vergleichen.
@
vorsimplexml_load_file
oder durch Hinzufügen eines Flags unterdrückt werden.simplexml_load_file
Weitere Informationen finden Sie auf der Handbuchseite von. Bitte löschen Sie Ihre Frage. Es handelt sich um ein Duplikat.