【发布时间】:2015-06-27 17:04:55
【问题描述】:
我有这个 xml(必须通过 HTML 剪切/粘贴)。
<tr>
<td>http://www.example.co.uk/the-view-from-22/feed/</td>
<td>Example Blogs » The View from 22 » Example Blogs</td>
<td>http://blogs.example.co.uk/</td>
<td><![CDATA[Listen: The Example’s verdict on the debate]]></td>
<td>http://blogs.example.co.uk/coffeehouse/2015/04/podcast-special-the-debate/</td>
</tr>
它正在被加载到一个 XML dom 文档中
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML( $xml->asXML() );
return $dom->saveXML();
但这会引发一个关于“’”的错误。实体未定义。
警告:DOMDocument::loadXML() [domdocument.loadxml]: Entity 'rsquo' 未在 Entity 中定义,...
因为它在 CDATA 部分中,所以我希望 DOMDocument 将其视为文本并忽略它......但它没有......有没有办法解决这个问题?
数据是直接从视图中的 mysql 数据库中提取的,因此首先“修复它”的空间不大 - 我在视图的 select 子句中添加了 CDATA,这是我的尝试修复!
编辑 按照下面的建议追溯它(干杯!)
正在使用 $xml->addChild( $key, $value ) 加载数据,但 $value 的格式为您推测的那样正在编码。
所以我只是在尝试这个......
How to write CDATA using SimpleXmlElement?
它有效 - 我现在正在加载原始文档:-
if (strpos(strtoupper($value),'<![CDATA[') === 0 && strpos(strrev($value),'>]]') === 0) {
$child = $xml->addChild( $key );
$node = dom_import_simplexml($child);
$no = $node->ownerDocument;
$node->appendChild($no->createCDATASection(substr($value,9,strlen($value)-12)));
//simple key/value child pair
} else {
$xml->addChild( $key, $value );
}
【问题讨论】:
-
请同时提供准确的错误信息。你为什么使用
$xml->asXML()?如果这是删除 CDATA 序列,它可能会创建无效的 XML(是的,这是可能的;我怀疑您在这里有一个 SimpleXMLElement)。 -
嗨,添加了实际的错误信息!最终结果是空白...
-
请将
$xml->asXML()的输出添加到问题中。我怀疑它与您发布的不同(可能直接来自您的数据库)。可以吗? -
同样无法重现:3v4l.org/K6LkS
-
您还需要将逐字 XML 添加到您的问题中,而不仅仅是您在浏览器显示时复制的那个。在浏览器中检查“查看源代码”并找到“XML”。