【问题标题】:Create or insert an xml into a CDATA在 CDATA 中创建或插入 xml
【发布时间】:2013-11-14 01:58:01
【问题描述】:

我一直在测试一些东西,但我无法让它工作,这是问题所在:

我有一个 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>

我现在面临的问题是:

  1. 从我对 CDATA 工作原理的看法来看,我似乎需要先完成所有“内部 xml”,然后才能剪切“内部 xml”,然后创建 cdata 部分并将其粘贴到 cdata 部分中
  2. 我正在使用 str_replace 临时解决方案,但我想尽可能多地使用 domdocument createCData 函数。

【问题讨论】:

  • 在 CDATA 中包含 XML 对我来说看起来不太好。目的是什么?
  • @michi 不知何故,我们合作伙伴的 API 要求我们包含它,没有它他们会给出系统错误。

标签: php xml domdocument cdata


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多