从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,但似乎仍然存在问题。
答案 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 & more</introduction>
<introduction><![CDATA[Some content & more]]></introduction>
</content>