将xml载入php文件时出现“ xmlParseEntityRef:无名称”警告


89

我正在使用读取PHP中的XML simplexml_load_file。但是,在尝试加载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中的变量中。我没有将priveleges写入index.php)


XML无效。您可能根本无法加载它。可以通过@在前面加上simplexml_load_file或添加标志来抑制错误,simplexml_load_file有关更多信息,请参见的手册页,请删除您的问题,它是重复的。
hakre 2011年

我可以看到我的答案引起了很多关注,如果这实际上是解决方案:您可以将其标记为“正确答案”吗?谢谢。
ricricucit,2014年

Answers:


143

XML很可能无效。

问题可能是“&”

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

将摆脱“&”并将其替换为HTML代码版本...尝试一下。


2
谢谢。你救了我的一天!
Saim

2
使用XML的最佳实践是确保没有冲突的字符,并且您应该在解析之前替换它们
Megamind先生,2017年

2
谢谢,这个问题的重点是因为xml无效
yussan

只需添加一点,如果您想替换所有的“&”号,请将“ g”附加到正则表达式中。更新后的解决方案如下所示: $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

80

在这里找到这个...

问题: XML解析器返回错误“ xmlParseEntityRef:noname”

原因: XML文本中的某处有一个流浪“&”(“&”字符),例如。一些文字和更多文字

解:

  • 解决方案1:删除&符。
  • 解决方案2:对“&”号进行编码(即替换 &字符&amp;)。读取XML文本时,请记住解码。
  • 解决方案3:使用CDATA节(解析器将忽略CDATA节中的文本。)。<![CDATA [一些文字和更多文字]]>

注意:如果处理不正确,“&”,“ <”,“>”都会出现问题。


9
今天救了我。
Bwire

我们知道为什么吗?而且,仍会由呈现某些数据的浏览器拾取CDATA部分吗?我的XML标签中有一些HTML标签,我需要将它们呈现给最终用户以使用编辑工具。
sulimmesh '16

11

尝试首先使用以下函数清除HTML:

$html = htmlspecialchars($html);

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


有人可以解释为什么这被否决吗?htmlspecialchars()&, ", <, >在元素数据中转换字符的精确函数。
JacobRossDev

7
该答案被否决了,因为在这种情况下无法正常工作。使用该函数将把“ <”转换为“&lt;”会完全破坏您的XML。我不知道您可以使用任何方式htmlspecialchars()而不破坏XML。我尝试了几个标志,但XML仍然损坏。
亚历克斯·芬纳

1
您应该htmlspecialchars在xml标记的内容上使用,而不是在整个XML上使用
gbalduzzi19年

7

我使用组合版本:

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

1
这是完美的工作。您只是缺少右括号的结尾
myh34d 2015年

7

问题

  • 尝试从URL加载XML文件时,PHP函数simplexml_load_file引发了解析错误parser error : xmlParseEntityRef

原因

  • URL返回的XML无效。它包含&值而不是&amp;。很可能在此刻还存在其他不太明显的错误。

无法控制的事情

  • 理想情况下,我们应该确保将有效的XML输入到PHPsimplexml_load_file函数中,但是看起来我们无法控制XML的创建方式。
  • 也不可能强制simplexml_load_file处理无效的XML文件。除了修复XML文件本身之外,它没有太多选择。

可能的解决方案

将无效的XML转换为有效的XML。可以使用来完成PHP tidy extension。可以从http://php.net/manual/en/book.tidy.php找到更多说明。

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

/**
 * 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生成)进行比较,以查看使用tidy后没有不利的副作用。Tidy正确地做得非常出色,但是从视觉上看到它并获得100%的肯定从来没有伤害。在我们的例子中,这就像将$ xml与$ tidy进行比较一样简单。




1

这解决了我的问题:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.