2010-01-26 12 views

risposta

4

Sfortunatamente, SimpleXML non gestisce i commenti. Come è stato menzionato, DOM gestisce i commenti ma è una specie di fastidio da usare per cose semplici, rispetto a SimpleXML.

La mia raccomandazione: prova SimpleDOM. È un'estensione di SimpleXML, quindi tutto funziona allo stesso modo e ha un sacco di metodi utili per gestire i DOM.

Ad esempio, può insertComment($content, $mode)append o inserire commenti before o after un dato nodo. Per esempio:

include 'SimpleDOM.php'; 

$root = simpledom_load_string('<root><value/></root>'); 

$root->value->insertComment(' mode: append ', 'append'); 
$root->value->insertComment(' mode: before ', 'before'); 
$root->value->insertComment(' mode: after ', 'after'); 

echo $root->asPrettyXML(); 

... sarà eco

<?xml version="1.0"?> 
<root> 
    <!-- mode: before --> 
    <value> 
    <!-- mode: append --> 
    </value> 
    <!-- mode: after --> 
</root> 
+0

Grazie Josh, potrei trovare utile anche questo. Non ho mai sentito parlare di quella libreria. – halfer

4

No, ma a quanto pare è possibile use DomDocument as a workaround (german):

$oNodeOld = dom_import_simplexml($oParent); 
    $oDom = new DOMDocument(); 
    $oDataNode = $oDom->appendChild($oDom->createElement($sName)); 
    $oDataNode->appendChild($oDom->createComment($sValue)); 
    $oNodeTarget = $oNodeOld->ownerDocument->importNode($oDataNode, true); 
    $oNodeOld->appendChild($oNodeTarget); 
    return simplexml_import_dom($oNodeTarget); 

Ma poi di nuovo, perché non usare DOM direttamente?

3

In realtà c'è un trucco sporco, sulla base del fatto che addChild non verifica se il nome di un elemento è valido:

$root->addChild('!-- Your comment --><dummy'); 

Quando si utilizza $root->asXML() si otterrebbe una stringa come questa:

<root><!-- Your comment --><dummy/></root> 

Si può notare che ha generato anche un elemento vuoto <dummy>, ma è il prezzo da pagare. Non cercare di aggiungere un valore, rovinerebbe tutto. Utilizzare solo in combinazione con asXML().

Bene, I ha fatto dire che è un trucco sporco. Non è consigliabile utilizzarlo in produzione, ma solo per scopi di debug/testing.

+0

C'è un errore nel tuo primo comando (manca '<' before, '!')? – beroe

+0

@beroe No, è esattamente così com'è. Prova. – MaxArt

+0

OK, fantastico. Ora vedo che viene incapsulato in '< />' che fornisce le parentesi "mancanti". Trucco sporco in effetti: ^) – beroe

Problemi correlati