使用CDATA时,它没有显示所有内容并添加了方括号

时间:2018-04-23 14:22:10

标签: php xml cdata htmlspecialchars

从API创建XML提要后,我知道我必须将CDATA用于几个节点。 有些工作正常,没有任何问题,但有些似乎缺少内容并显示]]>到最后。

$introduction = substr( $property['description'], 0 , 250 ); // Truncate Description at 250 characters
$description = $property['description'];

$ltd_introduction = $xml->createElement( 'introduction', htmlspecialchars( "<![CDATA[$introduction]]>" ) );
$ltd_description = $xml->createElement( 'description', htmlspecialchars( "<![CDATA[$description]]>" ) );

新创建的XML Feed显示:

<introduction>
<![CDATA[Lorem ipsum dolor sit amet]]>
</introduction>
<description>
<![CDATA[Lorem ipsum dolor sit amet]]>
</description>

但是在呈现的页面上,我混合了:

Lorem ipsum dolor sit amet

lorem ipsum dolor sit amet]]&gt;

坐下来]]&gt;

我知道可能会有特殊字符,并且XML Feed中有<br>显示为<br >此外,还会有包含重音符号的字母。

阅读了各种答案之后,我认为有必要添加CDATA部分和htmlspecialcharacters,但似乎仍然存在问题。

1 个答案:

答案 0 :(得分:1)

CDATA部分是一种特殊的字符数据节点,无需解码。它与普通文本节点不同。另外DOMDocument::createElement()的第二个参数被打破了。它只需要一半的逃逸。更好的方法是使用相应的方法创建文本节点或CDATA部分并附加它。 DOM将根据需要进行转义。

以下是两种节点类型的示例:

$document = new DOMDocument();
$content = $document->appendChild($document->createElement('content'));

$content
  ->appendChild($document->createElement('introduction'))
  ->appendChild($document->createTextNode('Some content & more'));
$content
  ->appendChild($document->createElement('introduction'))
  ->appendChild($document->createCdataSection('Some content & more'));

$document->formatOutput = TRUE;
echo $document->saveXml();

输出:

<?xml version="1.0"?>
<content>
  <introduction>Some content &amp; more</introduction>
  <introduction><![CDATA[Some content & more]]></introduction>
</content>