2009-06-11 5 views
11

Si tiene DOMNode en PHP, ¿cómo puede obtener el xml externo (es decir, todo el XML que está dentro de este elemento más el elemento mismo)?En PHP, ¿cómo puedo obtener el XML externo desde un DOMNode?

Por ejemplo, digamos que esta es la estructura

<car> 
<tire>Michelin</tire> 
<seats>Leather</seats> 
<type> 
    <color>red</color> 
    <make>Audi</make> 
</type> 
</car> 

Y tengo un puntero al nodo <tipo> ... Quiero volver

<type> 
    <color>red</color> 
    <make>Audi</make> 
</type> 

Si solo pido para el texto, recupero "redAudi".

+0

nota que en realidad estás preguntando por el * outer * xml, ya que incluye el nodo en sí. – nickf

Respuesta

17

Se necesita un DOMDocument:

// If you don't have a document already: 
$doc = new DOMDocument('1.0', 'UTF-8'); 

echo $doc->saveXML($node); // where $node is your DOMNode 

Comprobar DOMDocument :: saveXML en la documentación para obtener más información.

Cuando pasa un DOMNode a saveXML() solo recupera el contenido de ese nodo, no el documento completo.

+0

No, tengo un DOMNode (un subnodo del DOMDocument) y necesito extraer el InnerXML ... –

+0

rojoca dice que la clase DOMNode no tiene un método para extraer el XML original. En su lugar, debe pasar el nodo a un nuevo documento DOM para volver a codificarlo como XML. – Josh

+0

+1: ¡No sabía que pudieras hacer eso ...! – nickf

0

Usted podría intentar algo como:

function getInnerXml(DomNode $node){ 
    $xml = ''; 
    foreach($node->childNodes as $childNode){ 
    $xml .= $node->ownerDocument->saveXml($childNode); 
    } 
    return $xml; 
} 
+0

¿por qué no simplemente 'return $ node-> ownerDocument-> saveXxml ($ node) '? – nickf

+0

pero como, ya sabes ... sin el error tipográfico. – nickf

8

Después de una hora pasó, se me ocurrió esto (que parece ser la mejor solución)

$node->ownerDocument->saveXml($node); 
+0

El problema es que, a veces, un nodo no tiene un documento de propietario. P.ej. si proviene de \ XMLReader :: expand(). – donquixote

Cuestiones relacionadas