当我在下面的XML中使用DOMDocument :: loadXML()时,我收到错误:
Warning: DOMDocument::loadXML() [domdocument.loadxml]: CData section not finished http://www.site.org/displayimage.php?album=se in Entity,
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag image line 7 in Entity
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag quizz line 3 in Entity
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag quizzes line 2 in Entity
Fatal error: Call to a member function getElementsByTagName() on a non-object
在我看来,我的CData部分已关闭但仍然出现此错误。 XML看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<quizzes>
<quizz>
<title><![CDATA[Title]]></title>
<descr><![CDATA[Some text here!]]></descr>
<tags><![CDATA[one tag, second tag]]></tags>
<image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=1]]></image>
<results>
<result>
<title><![CDATA[Something]]></title>
<descr><![CDATA[Some text here]]></descr>
<image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=17]]></image>
<id>1</id>
</result>
</results>
</quizz>
</quizzes>
你能帮我发现问题是什么吗?
答案 0 :(得分:6)
我发现通常隐藏的XML字符存在问题,所以我更喜欢像心爱的转义无效字符:
<?php
//$feedXml is the fetched XML content
$invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/';
$feedXml = preg_replace($invalid_characters, '', $feedXml );
答案 1 :(得分:2)
很抱歉,如果这不是主题,因为它只与使用cURL时PHP的特定情况有关,但是,正如tomaszs所述,我也发现在&PHP中通过cURL传递XML时,&符号可能会导致问题。我收到了一个已知的有效XML字符串,其中&符号已正确编码,然后使用cURL将其转发到另一个地址。像这样......
$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $fullUri);
curl_setopt($curlHandle, CURLOPT_HEADER, false);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 4); // seconds
curl_setopt($curlHandle, CURLOPT_POST, true);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, "xmlstr=" . $xmlstr); // Problem
将XML添加到CURLOPT_POSTFIELDS时,问题出现在上面的最后一行。第一个编码的&符号被视为参数的分隔符,如在querstring中,并且“xmlstr”变量/字段被截断。
我使用的解决方案是用......替换上面的最后一行
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, "xmlstr=" . urlencode($xmlstr));
希望这有助于某人。
答案 2 :(得分:0)
这里的答案有正确的想法:文档中存在某种不良的,可能是非打印的字符,这会破坏解析器。上面的答案都没有解决我的问题,而是使用tr
来编写文件的“干净”版本然后我能够解析它,即
<?php
try {
$simpleXMLobject = simplexml_load_file($feed);
} catch (\Exception $ex) {
//try to clean the file and reload it
$tempFile = sys_get_temp_dir() . "/" . uniqid("rdc");
shell_exec(
"tr -cd '\11\12\15\40-\176' < " .
escapeshellarg($feed) . " > " .
escapeshellarg($tempFile)
);
try {
$simpleXMLobject = simplexml_load_file($tempFile);
} catch (\Exception $ex) {
$err = $ex->getTraceAsString();
echo die($err);
}
}
答案 3 :(得分:-1)
我没有看到任何错误(实际使用的XML与提供的不同,或者使用的xml处理器(BTW,它是什么?)是错误的。)
我建议避免使用CDATA部分。使用以下XML文档,它与提供的(与文本等效)相同,并且更具可读性:
<quizzes>
<quizz>
<title>Title</title>
<descr>Some text here!</descr>
<tags>one tag, second tag</tags>
<image>http://www.site.org/displayimage.php?album=search&cat=0&pos=1</image>
<results>
<result>
<title>Something</title>
<descr>Some text here</descr>
<image>http://www.site.org/displayimage.php?album=search&cat=0&pos=17</image>
<id>1</id>
</result>
</results>
</quizz>
</quizzes>
答案 4 :(得分:-2)
我发现问题在于使用cURL在PHP中传递此XML。我已将其作为普通文本发送,并且&amp;此XML中的char被解释为下一个参数的分隔符。因此,当我逃脱这个字符时,它开始正常工作。