Czytam xml w php przy użyciu simplexml_load_file
. Jednak podczas próby załadowania xml wyświetla listę ostrzeżeń
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
Jak poprawić, aby usunąć te ostrzeżenia?
(XML jest generowany z http://..../index.php/site/projects
adresu URL i ładowany do zmiennej w test.php. Nie mam uprawnień do zapisu do index.php)
@
przedsimplexml_load_file
lub dodając flagę, zapoznaj się ze stroną podręcznika,simplexml_load_file
aby uzyskać więcej informacji i usuń pytanie, jest to duplikat.Odpowiedzi:
XML jest najprawdopodobniej nieprawidłowy.
Problemem może być „&”
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
usunie znak „&” i zastąpi go jego wersją kodu HTML ... spróbuj.
źródło
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Znalazłem to tutaj ...
źródło
Spróbuj najpierw wyczyścić kod HTML za pomocą tej funkcji:
$html = htmlspecialchars($html);
Znaki specjalne są zwykle reprezentowane inaczej w HTML i może to być mylące dla kompilatora. Jak
&
się stanie&
.źródło
htmlspecialchars()
to dokładna funkcja do konwersji&, ", <, >
znaków w danych elementu.htmlspecialchars()
i nie złamać XML. Wypróbowałem kilka flag i mój XML nadal się zepsuł.htmlspecialchars
na treści tagu xml, a nie na całym XMLUżywam wersji łączonej:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
źródło
simplexml_load_file
generuje błąd analizyparser error : xmlParseEntityRef
podczas próby załadowania pliku XML z adresu URL.&
wartość zamiast&
. Jest całkiem możliwe, że są inne błędy, które nie są oczywiste w tym momencie.simplexml_load_file
funkcji PHP , ale wygląda na to, że nie mamy żadnej kontroli nad sposobem tworzenia XML.simplexml_load_file
przetwarzania nieprawidłowego pliku XML. Nie pozostawia nam to wielu opcji poza naprawą samego pliku XML.Konwertuj nieprawidłowy XML na prawidłowy XML. Można to zrobić za pomocą
PHP tidy extension
. Dalsze instrukcje można znaleźć pod adresem http://php.net/manual/en/book.tidy.phpPo upewnieniu się, że rozszerzenie istnieje lub jest zainstalowane, wykonaj następujące czynności.
/** * 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);
Deweloper powinien spróbować porównać nieprawidłowy plik XML z prawidłowym kodem XML (wygenerowanym przez tidy), aby zobaczyć, że po użyciu tidy nie ma żadnych niepożądanych skutków ubocznych. Tidy wykonuje bardzo dobrą robotę, robiąc to poprawnie, ale nigdy nie boli zobaczyć go wizualnie i mieć 100% pewności. W naszym przypadku powinno to być tak proste, jak porównanie $ xml z $ tidy.
źródło
XML jest nieprawidłowy.
CDATA należy zawinąć wokół wszystkich specjalnych znaków XML, zgodnie z W3C
źródło
Dzieje się tak, ponieważ postacie bawią się danymi. Używanie
htmlentities($yourText)
zadziałało dla mnie (miałem kod HTML w dokumencie xml). Zobacz http://uk3.php.net/htmlentities .źródło
To rozwiązuje mój problem:
$description = strip_tags($value['Description']); $description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description); $description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); $description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));
źródło
Jeśli napotykasz ten problem z opencart, spróbuj edytować
źródło