Php 在CDATA中创建或插入xml

Php 在CDATA中创建或插入xml,php,xml,domdocument,cdata,Php,Xml,Domdocument,Cdata,我一直在测试一些东西,但我无法让它工作,问题是: 我有一个xml: <?xml version="1.0" encoding="UTF-8"?> <history> <name> <age/> </name> </history> 它生成以下xml: <?xml version="1.0" encoding="UTF-8"?> <history> <na

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

我有一个xml:

<?xml version="1.0" encoding="UTF-8"?>
<history>
    <name>
        <age/>
    </name>
</history>
它生成以下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>

]]>
我目前面临的问题是:

  • 从我看待CDATA工作原理的角度来看,在剪切“内部xml”,然后创建CDATA部分并将其粘贴到CDATA部分之前,我需要完成所有的“内部xml”
  • 我使用的临时解决方案是str_replace,但我希望尽可能多地利用domdocument createCData函数

  • 你在正确的轨道上。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>
    
    <history><![CDATA[<name><age/></name><address/>]]></history>
    
    输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <history><![CDATA[<name><age/></name>]]></history>
    
    <history><![CDATA[<name><age/></name><address/>]]></history>
    
    ]>
    
    你走对了方向。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>
    
    <history><![CDATA[<name><age/></name><address/>]]></history>
    
    输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <history><![CDATA[<name><age/></name>]]></history>
    
    <history><![CDATA[<name><age/></name><address/>]]></history>
    
    ]>
    
    在CDATA中包含XML对我来说不太好。目的是什么?@michi不知何故,我们合作伙伴的API要求我们包含它,没有它,他们会给出系统错误。在CDATA中包含XML对我来说不太好。目的是什么?@michi不知何故,我们合作伙伴的API要求我们包含它,如果没有它,他们会给出系统错误。