“xmlParseEntityRef:无名字”的警告,而加载到PHP文件的XML

我正在阅读PHP中使用simplexml_load_file xml。 然而,当试图加载XML它显示一个警告列表

 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 

我该如何纠正以消除这些警告?

(XML是从url http://..../index.php/site/projects生成的,并加载到test.php中的一个variables中。我没有写index.php文件)

XML很可能是无效的。

问题可能是“&”

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

将摆脱“&”并将其replace为它的HTML代码版本…试一试。

在这里find了…

问题: XMLparsing器返回错误“xmlParseEntityRef:noname”

原因: XML文本中存在一个“&”符号(&符号)。 一些文字和一些更多的文字

解:

  • 解决scheme1:删除&符号。
  • 解决scheme2:对&符号进行编码(即用“&amp;”replace“&”字符)。 记得在阅读XML文本时解码。
  • 解决scheme3:使用CDATA部分(CDATA部分内的文本将被parsing器忽略)。 <![CDATA [一些文本和一些更多的文本]]>

注意:如果处理不当,'&''<''>'将会出现问题。

尝试使用此function首先清理HTML:

 $html = htmlspecialchars($html); 

特殊字符通常在HTML中表示方式不同,可能会让编译器感到困惑。 像&变成&amp;

我使用组合版本:

 strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml)) 

XML是无效的。

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

根据W3C ,CDATA应该包裹所有特殊的XML字符

问题

  • PHP函数simplexml_load_file在尝试从URL加载XML文件时抛出parsing错误parser error : xmlParseEntityRef

原因

  • URL返回的XML不是有效的XML。 它包含& value而不是&amp; 。 在这个时候很可能还有其他的不明显的错误。

事情失控我们的控制

  • 理想情况下,我们应该确保将一个有效的XML提供给PHP simplexml_load_file函数,但是看起来我们没有任何控制XML的方式。
  • 强制使用simplexml_load_file来处理无效的XML文件也是不可能的。 除了修复XML文件本身,它并没有给我们留下很多select。

可能的解决scheme

将无效的XML转换为有效的XML。 可以使用PHP tidy extension 。 进一步的说明可以从http://php.net/manual/en/book.tidy.phpfind

一旦确定分机存在或已安装,请执行以下操作。

 /** * 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); 

警告

开发者应该尝试比较无效的XML和有效的XML(整齐生成),看看使用整洁后是否有不良的副作用。 Tidy做得非常出色,但是从视觉上看它并不会让人感到痛苦。 在我们的例子中,它应该像比较$ xml和$ tidy一样简单。

这是由于人物与数据混杂在一起。 使用htmlentities($yourText)为我工作(我在xml文档中有html代码)。 见http://uk3.php.net/htmlentities

这解决了我的问题:

 $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))));