I'm using simpleXML to add in a child node within one of my XML documents... when I do a print_r on my simpleXML object, the is still being displayed as a
in the view source. However, after I save this object back to XML using DOMDocument, the
is converted to
<
and the >
is converted to >
Any ideas on how to change this behavior? I've tried adding dom->substituteEntities = false;
, but this did no good.
//Convert SimpleXML element to DOM and save
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->substituteEntities = false;
$dom->loadXML($xml->asXML());
$dom->save($filename);
Here is where I'm using the <:>
$new_hint = '';
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint);
The problem, is I'm using simple XML to iterate through certain nodes in the XML document, and if an attribute matches a given ID, a specific child node is added with CDATA. Then after all processsing, I save the XML back to file using DOMDocument, which is where the
Here is a link to my entire class file, so you can get a better idea on what I'm trying to accomplish. Specifically refer to the hint_insert() method at the bottom.
SimpleXML и модуль DOM php5 используют одно и то же внутреннее представление документа (поддерживается libxml ). Вы можете переключаться между обоими API без повторного анализа документа с помощью simplexml_import_dom () и dom_import_simplexml () .
Т.е. если вы действительно хотите / должны выполнить итерацию с API SimpleXML после того, как вы нашли свой элемент, вы можете переключиться на API DOM и создать раздел CData в том же документе.
<?php
$doc = new SimpleXMLElement('<a>
<b id="id1">a</b>
<b id="id2">b</b>
<b id="id3">c</b>
</a>');
foreach( $doc->xpath('b[@id="id2"]') as $b ) {
$b = dom_import_simplexml($b);
$cdata = $b->ownerDocument->createCDataSection('0<>1');
$b->appendChild($cdata);
unset($b);
}
echo $doc->asxml();
печатает
<?xml version="1.0"?>
<a>
<b id="id1">a</b>
<b id="id2">b<![CDATA[0<>1]]></b>
<b id="id3">c</b>
</a>
Проблема в том, что вы, вероятно, добавляете это как строку, а не как элемент.
Итак, вместо:
$simple->addChild('foo', '<something/>');
, который будет обрабатываться как текст:
$child = $simple->addChild('foo');
$child->addChild('something');
У вас не может быть литерала <
в теле XML-документа, если это не открытие тега.
Edit: После того, что вы описали в комментариях, я думаю, что вам нужно:
DomDocument :: createCDatatSection ()
$child = $dom->createCDataSection('your < cdata > body ');
$dom->appendChild($child);
Edit2: После прочтения вашего редактирования я заметил только одно. может сказать:
Вы делаете это неправильно ...
Вы не можете добавлять элементы как строковое значение для другого элемента. Извини, ты просто не можешь. Вот почему он избегает вещей, потому что DOM и SimpleXML предназначены для того, чтобы вы всегда создавали действительный XML. Вам нужно создать элемент как объект ... Итак, если вы хотите создать дочерний элемент CDATA, вам нужно будет сделать что-то вроде этого:
$child = $PrintQuestion.....->addChild('TextFragment');
$domNode = dom_import_simplexml($child);
$cdata = $domNode->ownerDocument->createCDataSection($value[0]);
$domNode->appendChild($cdata);
Вот и все, что должно быть ...