将xml加载到php文件时,'xmlParseEntityRef:没有名称'警告

时间:2011-09-29 23:20:04

标签: php xml simplexml

我正在使用simplexml_load_file在php中读取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&amp;生成的,加载到test.php中的一个变量。我没有写index.php的文件)

9 个答案:

答案 0 :(得分:125)

XML很可能无效。

问题可能是“&amp;”

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

将摆脱“&amp;”并用它的HTML代码版本替换它......试一试。

答案 1 :(得分:62)

找到此here ...

  

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

     

原因:在XML文本的某处有一个迷路'&amp;'(&符号)。一些文字&amp;更多文字

     

<强>解决方案:

     
      
  • 解决方案1:取下&符号。
  •   
  • 解决方案2:对&符号进行编码(将'&amp;'字符替换为'&amp; amp;')。记得在阅读XML时解码   文本。
  •   
  • 解决方案3:使用CDATA部分(解析器将忽略CDATA部分内的文本。)例如。 &lt;![CDATA [some text&amp;多一点   文本]&GT;
  •   
     

注意:'&amp;''&lt;'如果处理不当,'&gt;'会产生问题。

答案 2 :(得分:9)

尝试使用此功能首先清理HTML:

$html = htmlspecialchars($html);

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

答案 3 :(得分:6)

XML无效。

<![CDATA[ 
{INVALID XML}
]]> 
根据{{​​3}}

,CDATA应该包含所有特殊的XML字符

答案 4 :(得分:6)

我使用合并版本:

var valJson = $('#peoplePickerDiv1_TopSpan_HiddenInput').val();
var parsed = $.parseJSON(valJson);
console.log(parsed[0].Key);

答案 5 :(得分:6)

  

<强>问题

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

<强>原因

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

我们控制之外的事情

  • 理想情况下,我们应确保将有效的XML提供给PHP simplexml_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做得非常好,但是从视觉上看它并且100%确定它永远不会伤害。在我们的例子中,它应该像将$ xml与$ tidy进行比较一样简单。

答案 6 :(得分:3)

这是由于人物搞乱数据造成的。使用htmlentities($yourText)为我工作(我在xml文档中有html代码)。请参阅http://uk3.php.net/htmlentities

答案 7 :(得分:0)

这解决了我的问题:

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

答案 8 :(得分:0)

如果您在使用opencart尝试编辑时遇到此问题

  

目录/控制器/扩展/原料/ google_sitemap.php   有关详细信息以及如何操作,请参阅:xmlparseentityref-no-name-error