How to keep DOMDocument from saving < as <

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.

http://pastie.org/1079562

8
задан ThinkingInBits 6 August 2010 в 13:34
поделиться

2 ответа

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>
10
ответ дан 5 December 2019 в 12:54
поделиться

Проблема в том, что вы, вероятно, добавляете это как строку, а не как элемент.

Итак, вместо:

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

Вот и все, что должно быть ...

3
ответ дан 5 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: