2010-08-06 26 views
8

Używam simpleXML do dodania węzła podrzędnego w jednym z moich dokumentów XML ... kiedy robię print_r na moim obiekcie simpleXML, < jest nadal wyświetlany jako < w źródle widoku. Jednak po tym, jak uratować ten obiekt z powrotem do XML przy użyciu domDocument The < przekształca się &lt; a > przekształca się &gt;Jak zapobiec zapisywaniu DOMDocument <as & lt

Wszelkie pomysły jak to zmienić? Próbowałem dodać dom->substituteEntities = false;, ale to nie pomogło.

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

Oto gdzie Używam <:

$new_hint = '<![CDATA[' . $value[0] . ']]>';    
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint); 

Problemem jest Używam prostego XML iterację niektórych węzłach w dokumencie XML, a jeśli atrybut dopasowuje dany identyfikator, określony węzeł potomny jest dodawany z CDATA. Następnie po wszystkich żywnościowego, ja zapisać do pliku XML z powrotem przy użyciu domDocument, czyli tam, gdzie < przekształca się & LT, itp

Oto link do mojego całego pliku klasy, dzięki czemu można uzyskać lepszy pomysł na co próbuję osiągnąć. W szczególności odwołaj się do metody hint_insert() na dole.

http://pastie.org/1079562

+0

'<' nie jest po prostu charakter prawny w obrębie elementu XML (o ile jesteś w sekcji CDATA). Co próbujesz osiągnąć? – MvanGeest

+0

Próbuję dodać znacznik CDATA ... Sprawdź oryginalny wpis w celu zaktualizowania kodu – ThinkingInBits

+0

Dzięki za głosowanie w dół! Znacznik CDATA jest niezbędny (chyba, że ​​uciekniesz) w xml, gdy masz "<' and '>" w węźle! Taki sam jak XHTML ... – xandercoded

Odpowiedz

10

SimpleXML i php5's DOM module używają tej samej wewnętrznej reprezentacji dokumentu (ułatwione przez libxml). Możesz przełączać się między obydwoma apis bez konieczności ponownego analizowania dokumentu przez simplexml_import_dom() i dom_import_simplexml().
tj.jeśli naprawdę chcesz/musisz wykonać iterację za pomocą apiksu SimpleXML, gdy już znajdziesz swój element, możesz przejść do DOM api i create the CData section w tym samym dokumencie .

<?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(); 

drukuje

<?xml version="1.0"?> 
<a> 
    <b id="id1">a</b> 
    <b id="id2">b<![CDATA[0<>1]]></b> 
    <b id="id3">c</b> 
</a> 
+0

DZIĘKUJEMY. To są informacje, których potrzebowałem. Nie zdawałem sobie sprawy, że mogę używać obu zamiennie. – ThinkingInBits

+0

Czy ustawienie $ b = dom_import_simplexml ($ b) zepsuć iterację? – ThinkingInBits

+0

Działa, ale nie rozumiem w 100% dlaczego: P – ThinkingInBits

3

Problemem jest to, że jesteś prawdopodobnie dodając, że jako ciąg znaków, a nie jako element.

Więc zamiast:

$simple->addChild('foo', '<something/>'); 

które będą traktowane jako tekst:

$child = $simple->addChild('foo'); 
$child->addChild('something'); 

nie można mieć dosłownego < w treści dokumentu XML chyba że jest to otwarcie znacznik.

Edit: Po tym, co można opisać w komentarzach, myślę, że jesteś po:

DomDocument::createCDatatSection()

$child = $dom->createCDataSection('your <cdata> body '); 
$dom->appendChild($child); 

Edit2: Po przeczytaniu tej edycji, jest tylko jedna rzecz, mogę powiedz:

You're doing it wrong... Nie można dodawać elementów jako wartości ciągów do innego elementu. Przepraszam, po prostu nie możesz. Właśnie dlatego ucieka od rzeczy, ponieważ DOM i SimpleXML są po to, aby upewnić się, że zawsze tworzysz poprawny XML. Musisz utworzyć element jako obiekt ... Tak więc, jeśli chcesz stworzyć dziecku CDATA, trzeba by zrobić coś takiego:

$child = $PrintQuestion.....->addChild('TextFragment'); 
$domNode = dom_import_simplexml($child); 
$cdata = $domNode->ownerDocument->createCDataSection($value[0]); 
$domNode->appendChild($cdata); 

To wszystko nie powinno być z nim ...

+0

To otwieranie i zamykanie znacznika CDATA daje mi problem ... Zapoznaj się z oryginalnym wpisem. – ThinkingInBits

+0

@ThinkingInBits: Patrz edytuj – ircmaxell

+0

To była również właściwa odpowiedź, po prostu nie rozumiałem tego w tym czasie. Zgłoszone, dzięki. – ThinkingInBits

Powiązane problemy