'xmlParseEntityRef:没有名称'警告当加载xml到一个php文件

4sup72z8  于 2023-08-02  发布在  PHP
关注(0)|答案(9)|浏览(207)

我正在使用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生成的&加载到test.php中的变量中。I don't have write priveleges to index.php)*
1tuwyuhd

1tuwyuhd1#

XML很可能无效。问题可能出在“&”

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

字符串
我将删除“&”,并将其替换为HTML代码版本...给予试试看吧。

yftpprvb

yftpprvb2#

找到此here ...

**问题:**XML解析器返回错误“xmlParseEntityRef:无名氏
**原因:**在XML文本中的某个地方有一个“&”(与字符),例如。一些文本&更多文本
解决方案:

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

注意:'&' '<' '>'如果处理不正确,都会给予问题。

fwzugrvs

fwzugrvs3#

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

$html = htmlspecialchars($html);

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

ckocjqey

ckocjqey4#

我使用的是一个组合版本:

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

字符串

hfsqlsce

hfsqlsce5#

问题

  • 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(由trigy生成)进行比较,以查看使用trigy后是否有不良的副作用。Tidy在正确地做这件事上做得极其出色,但从视觉上看,并100%肯定,这从来没有坏处。在我们的例子中,它应该像比较$xml和$tidy一样简单。

thigvfpy

thigvfpy6#

XML无效。

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

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

lhcgjxsq

lhcgjxsq7#

这实际上是由于字符在数据上乱搞。使用htmlentities($yourText)对我来说很有效(我在xml文档中有html代码)。请参阅http://uk3.php.net/htmlentities

5us2dqdw

5us2dqdw8#

这解决了我的问题:

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

字符串

vohkndzv

vohkndzv9#

如果你在opencart遇到这个问题,请尝试编辑
catalog/controller/extension/feed/google_sitemap.php更多信息和如何做到这一点,请参考此:xmlparseentityref-no-name-error

相关问题