我一直在测试一些东西,但我不能让它工作,这就是问题所在:
我有一个xml:
<?xml version="1.0" encoding="UTF-8"?>
<history>
<name>
<age/>
</name>
</history>
我想在该XML中插入CDATA,CDATA的内容也是xml的一部分,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<history>
<![CDATA[
<name>
<age/>
</name>
]]>
</history>
我正在使用DOMDocument来创建xml:
header('Content-Type: text/xml');
$xml = new DOMDocument("1.0","UTF-8");
$base = $xml->appendChild($xml->createElement('history'));
$name = $base->appendChild($xml->createElement('name'));
$age = $name->appendChild($xml->createElement('age'));
$test = $xml->saveXML();
$xml->getElementsByTagName('history')->item(0)->appendChild($xml->createCDATASection($test));
$xml->formatOutput = true;
echo $xml->saveXML();
它会生成这个xml:
<?xml version="1.0" encoding="UTF-8"?>
<history>
<name>
<age/>
</name>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?><history><name><age/></name></history>]]>
</history>
我现在面临的问题是:
答案 0 :(得分:1)
你走在正确的轨道上。 CDATA部分是外部文档的文本,CDATA内部的xml片段是它自己的文档或片段。
$xml = new DOMDocument("1.0","UTF-8");
$xml->appendChild($historyNode = $xml->createElement('history'));
$innerXml = new DOMDocument("1.0","UTF-8");
$innerXml->appendChild($nameNode = $innerXml->createElement('name'));
$nameNode->appendChild($ageNode = $innerXml->createElement('age'));
$fragment = $innerXml->saveXml($innerXml->documentElement);
$historyNode->appendChild($xml->createCDATASection($fragment));
$xml->formatOutput = true;
echo $xml->saveXML();
输出:
<?xml version="1.0" encoding="UTF-8"?>
<history><![CDATA[<name><age/></name>]]></history>
这仅在片段具有单个根节点(是有效的xml文档)时才有效。如果它在顶层有多个节点,则需要一个虚拟节点。我在下一个示例中添加了“地址”以显示差异:
$xml = new DOMDocument("1.0","UTF-8");
$xml->appendChild($historyNode = $xml->createElement('history'));
$innerXml = new DOMDocument("1.0","UTF-8");
$innerXml->appendChild($fragmentNode = $innerXml->createElement('fragment'));
$fragmentNode->appendChild($nameNode = $innerXml->createElement('name'));
$nameNode->appendChild($ageNode = $innerXml->createElement('age'));
$fragmentNode->appendChild($addressNode = $innerXml->createElement('address'));
$fragment = '';
foreach ($fragmentNode->childNodes as $childNode) {
$fragment .= $innerXml->saveXml($childNode);
}
$historyNode->appendChild($xml->createCDATASection($fragment));
$xml->formatOutput = true;
echo $xml->saveXML();
输出:
<history><![CDATA[<name><age/></name><address/>]]></history>