2013-11-14 3 views
1

Я тестирования что-то, но я не могу заставить его работать, вот проблема:Создать или вставить XML в CDATA

У меня есть XML:

<?xml version="1.0" encoding="UTF-8"?> 
<history> 
    <name> 
     <age/> 
    </name> 
</history> 

Я хотел бы, чтобы вставить CDATA в том, что XML и содержание 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 как можно больше.
+0

включая XML в CDATA не выглядит хорошо для меня. В чем цель? – michi

+0

@michi каким-то образом API нашего партнера требует, чтобы мы включили его, без него они выдают Системную ошибку. – Ponce

ответ

1

Вы на правильном пути. Секции CDATA представляют собой текст для внешнего документа, фрагмент xml внутри CDATA - это собственный документ или фрагмент.

$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>