2012-10-10 18 views
5

Todavía soy bastante nuevo con SimpleXml. Lo que estoy tratando de hacer:Cómo obtener el texto interno de un elemento con SimpleXml

Tengo muchos archivos xml, que se compilan sobre el mismo. Mi problema es que a veces hay más nodos en mi nodo objetivo. Ejemplo (tratando de conseguir el cuerpo):

archivo XML 1

<?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
<firstname>My name is WHAT</firstname> 
<lastname>My name is WHO</lastname> 
<body>My name is CHIKA CHIKA Slim-Shady</body> 
</note> 

archivo XML 2

<?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
<firstname>My name is WHAT</firstname> 
<lastname>My name is WHO</lastname> 
<body><b>My name is CHIKA CHIKA Slim-Shady</b></body> 
</note> 

puedo obtener el texto en el primer archivo sin ningún problema:

$xml = simplexml_load_file("filename.xml"); 
echo $xml->note->body; 

Pero cuando trato de hacer lo mismo en el segundo archivo no me devuelve nada.

¿Cómo puedo obtener php para que solo escuche el texto en un nodo, sin tener en cuenta ningún nodo adicional dentro del nodo de destino?

Respuesta

9

Para que el recorrido

echo $xml->note->body; 

Para trabajar, su margen de beneficio tendría que ser

<note> 
    <note> 
     <body> 
     … 

Para evitar este tipo de errores, es una buena práctica para nombrar la variable que simplexml_load_file posteriores al nacimiento del elemento raíz en el marcado, por ejemplo,

$note = simplexml_load_string($xml); 

para obtener el "innerText" de un SimpleXMLElement que puede hacer:

echo strip_tags($note->body->asXml()); 

el método asXML() le dará la "OuterXml" que luego se quita con strip_tags.

La alternativa sería importando el nodo en el DOM y luego conseguir es nodeValue

echo dom_import_simplexml($note->body)->nodeValue; 
+0

Guau, eso fue rápido ... no esperaba obtener tantas respuestas en tan solo unos minutos. – noClue

+0

Después de retocar por un tiempo finalmente lo conseguí para trabajar. Muchos tnx! – noClue

+1

Odio cuando las personas en tales discusiones dicen "Lo tengo para trabajar" en lugar de publicar CÓMO lo hicieron funcionar por cierto. strip_tags eliminará TODAS las etiquetas, incluidas las etiquetas de innerXml – Algoman

0

No es necesario añadir note Debe ser

Primera Uno

echo $xml->body; 

Segundo uno

echo $xml->body->b ; 

salida

My name is CHIKA CHIKA Slim-Shady 
+0

si bien es cierto que la nota está mal aquí, sólo resuelve la mitad del problema, porque esto no va a producir la salida que usted piensa lo hará: http://codepad.org/LiireTxn – Gordon

+0

La edición omite la pregunta: * ¿Cómo puedo hacer para que php solo escuche el texto en un nodo, sin tener en cuenta ningún nodo adicional dentro del nodo de destino? * – Gordon

+0

'I puede obtener el texto en el primer archivo sin ningún problema: 'contradice que .....' $ xml-> note-> body' no funciona en ninguno de los formatos – Baba

Cuestiones relacionadas