2012-10-10 14 views
5

Sono ancora abbastanza nuovo con SimpleXml. Quello che sto cercando di fare:Come ottenere il innerText di un elemento con SimpleXml

Ho molti file xml, che sono costruiti all'incirca nello stesso modo. Il mio problema è che a volte ci sono più nodi nel mio nodo di destinazione. Esempio (cercando di ottenere il corpo):

file 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> 

file 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> 

posso ottenere il testo del primo file senza alcun problema:

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

Ma quando provo a fare lo stesso nel secondo file non ottengo nulla indietro.

Come posso ottenere php per sputare solo il testo in un nodo, indipendentemente da eventuali nodi aggiuntivi all'interno del nodo di destinazione?

risposta

9

Affinché l'attraversamento

echo $xml->note->body; 

Per lavorare, il markup sarebbe bisogno di essere

<note> 
    <note> 
     <body> 
     … 

Per evitare tali errori, è buona norma dare un nome al variabile simplexml_load_file in dopo l'elemento principale nel markup, ad esempio,

$note = simplexml_load_string($xml); 

per ottenere il "innerText" di un SimpleXMLElement si può fare:

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

il metodo asXML() vi darà la "OuterXml", che quindi si rimuove con strip_tags.

L'alternativa sarebbe importerà il nodo in DOM e quindi ottenere è nodeValue

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

Wow è stato veloce ... non aspettavamo di ottenere così tante risposte in pochi minuti. – noClue

+0

Dopo aver armeggiato per un po 'ho finalmente avuto modo di funzionare. Molti tnx! – noClue

+1

Odio quando le persone in tali discussioni dicono semplicemente "Ho avuto modo di lavorare" invece di postare come hanno ottenuto il lavoro btw. strip_tags rimuoverà TUTTI i tag, inclusi i tag da innerXml – Algoman

0

Non è necessario aggiungere note Dovrebbe essere

First One

echo $xml->body; 

seconda

echo $xml->body->b ; 

uscita

My name is CHIKA CHIKA Slim-Shady 
+0

mentre è vero che nota è sbagliato qui, risolve solo metà del problema, perché questo non produrrà l'output si pensa sarà: http://codepad.org/LiireTxn – Gordon

+0

La modifica manca la domanda: * Come posso ottenere php per sputare solo il testo in un nodo, indipendentemente da eventuali nodi aggiuntivi all'interno del nodo di destinazione? * – Gordon

+0

'I può ottenere il testo nel primo file senza problemi: 'contraddice che .....' $ xml-> note-> body' non funziona su nessuno dei formati – Baba

Problemi correlati