'xmlParseEntityRef: no name' warnt beim Laden von xml in eine PHP-Datei

89

Ich lese eine XML in PHP mit simplexml_load_file. Beim Versuch, die XML zu laden, wird jedoch eine Liste mit Warnungen angezeigt

Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

Wie kann ich diese Warnungen korrigieren?

(XML wird aus URL generiert http://..../index.php/site/projectsund in eine Variable in der Datei test.php geladen. Ich habe keine Schreibrechte für index.php)

Rajat Gupta
quelle
Das XML ist ungültig. Möglicherweise können Sie es überhaupt nicht laden. Fehler können durch Hinzufügen @vor simplexml_load_fileoder durch Hinzufügen eines Flags unterdrückt werden. simplexml_load_fileWeitere Informationen finden Sie auf der Handbuchseite von. Bitte löschen Sie Ihre Frage. Es handelt sich um ein Duplikat.
hakre
Ich kann sehen, dass meine Antwort ziemlich viel Aufmerksamkeit erhält, wenn das tatsächlich die Lösung ist: Können Sie sie bitte als "richtige Antwort" kennzeichnen? Vielen Dank.
Ricricucit

Antworten:

143

Das XML ist höchstwahrscheinlich ungültig.

Das Problem könnte das "&" sein

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text);

wird das "&" los und ersetzt es durch seine HTML-Code-Version ... probieren Sie es aus.

Ricricucit
quelle
2
Danke dir. Du hast meinen Tag gerettet!
Saim
2
Die beste Vorgehensweise bei der Arbeit mit XML besteht darin, sicherzustellen, dass keine widersprüchlichen Zeichen vorhanden sind, und Sie sollten sie vor dem
Mr Megamind
2
danke, Hauptpunkt dieser Frage ist, weil XML ungültig ist
Yussan
80

Fand das hier ...

Problem: Ein XML-Parser gibt den Fehler "xmlParseEntityRef: noname" zurück.

Ursache: Irgendwo im XML-Text befindet sich ein streunendes '&' (kaufmännisches Und-Zeichen), z. etwas Text & etwas mehr Text

Lösung:

  • Lösung 1: Entfernen Sie das kaufmännische Und.
  • Lösung 2: Codieren Sie das kaufmännische Und (dh ersetzen Sie das &Zeichen durch &amp;). Denken Sie beim Lesen des XML-Textes an die Dekodierung.
  • Lösung 3: Verwenden Sie CDATA-Abschnitte (Text in einem CDATA-Abschnitt wird vom Parser ignoriert). <! [CDATA [etwas Text & etwas mehr Text]]>

Hinweis: '&' '<' '>' gibt Probleme, wenn sie nicht richtig behandelt werden.

King'ori Maina
quelle
9
Das hat mich heute gerettet.
Bwire
Wissen wir warum das so ist? Wird ein CDATA-Abschnitt auch weiterhin von einem Browser erfasst, der einige dieser Daten rendern würde? Ich habe einige HTML-Tags in meinen XML-Tags und sie müssen dem Endbenutzer für ein Bearbeitungswerkzeug gerendert werden.
Sulimmesh
11

Versuchen Sie zuerst, den HTML-Code mit dieser Funktion zu bereinigen:

$html = htmlspecialchars($html);

Sonderzeichen werden in HTML normalerweise anders dargestellt und können für den Compiler verwirrend sein. Wie &wird &amp;.

Ufuk Özdemir
quelle
Kann jemand erklären, warum dies abgelehnt wird? htmlspecialchars()ist die genaue Funktion zum Konvertieren von &, ", <, >Zeichen in die Elementdaten.
JacobRossDev
7
Diese Antwort wurde abgelehnt, da sie in diesem Fall nicht gut funktioniert. Wenn Sie diese Funktion verwenden, wird Ihr XML durch Konvertieren von "<" in "& lt;" vollständig beschädigt. Mir ist nicht bekannt, wie Sie htmlspecialchars()XML verwenden und nicht beschädigen können. Ich habe ein paar Flags ausprobiert und mein XML ist immer noch kaputt.
Alex Finnarn
1
Sie sollten htmlspecialcharsfür den Inhalt eines XML-Tags verwenden, nicht für das gesamte XML
gbalduzzi
7

Ich benutze eine kombinierte Version:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))
Reign.85
quelle
1
Dieser funktioniert perfekt. Sie vermissen nur die rechte
Endklammer
7

PROBLEM

  • Die PHP-Funktion simplexml_load_filelöst parser error : xmlParseEntityRefbeim 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 &amp;. 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_fileFunktion 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_filedie 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 &amp; Development for under developed nations">
      <invalid-data>Some other data containing &amp; 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.

Kamal Soni
quelle
6

Das XML ist ungültig.

<![CDATA[ 
{INVALID XML}
]]> 

CDATA sollte gemäß W3C um alle XML-Sonderzeichen gewickelt werden

Edwin Daniels
quelle
3

Dies liegt in der Tat daran, dass Zeichen mit den Daten herumspielen. Die Verwendung htmlentities($yourText)hat bei mir funktioniert (ich hatte HTML-Code im XML-Dokument). Siehe http://uk3.php.net/htmlentities .

Guillaume
quelle
1

Dies löst mein Problem:

$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description))));
Malki Mohamed
quelle