2010-08-29 16 views
5

test.htmlCosa sto facendo male con xpath?

<html> 
    <body> 
     <span> hello Joe</span> 
     <span> hello Bob</span> 
     <span> hello Gundam</span> 
     <span> hello Corn</span> 
    </body> 
</html> 

file PHP

$doc = new DOMDocument(); 
$doc->loadHTMLFile("test.html"); 

$xpath = new DOMXPath($doc); 

$retrieve_data = $xpath->evaluate("//span"); 

echo $retrieve_data->item(1); 
var_dump($retrieve_data->item(1)); 
var_dump($retrieve_data); 

Sto cercando di usare XPath per trovare le campate e then echo, ma a quanto pare non posso eco esso. Ho provato di dumping per vedere se sta valutando correttamente, e non sono sicuro che cosa significa questo in uscita:

object(DOMElement)#4 (0) { } 
object(DOMNodeList)#7 (0) { } 

ciò che fa la #4 e #7 significa e che cosa significa la parentesi; Che cosa significa la sintassi?

Aggiornamento: Questo è l'errore che ottengo quando provo a echo $retrieve_data; e $retrieve_data->item(1);

Catchable fatal error: Object of class DOMNodeList could not be converted to string 
+0

Non è una risposta alla tua domanda, ma ci sono le librerie DOM PHP che permettono l'esecuzione di query gli oggetti il ​​modo in jQuery che si sente molto più naturale per me che XPath. Io * odio * XPath. [PHPQuery] (http://code.google.com/p/phpquery/) utilizza il DOM PHP - esempi [qui] (http://phpquery-library.blogspot.com/); [SimpleHTMLDOM] (http://simplehtmldom.sourceforge.net/) è basato su stringhe ma anche molto bello. –

+0

Non conosco la sintassi XPath di PHP, ma hai provato "// span/text()"? Al momento, stai selezionando gli elementi, ma vuoi produrre il testo all'interno degli elementi. –

+1

@chris_l Non è ** sintassi XPath ** di PHP. È solo XPath. Lo stesso in qualsiasi altra lingua, solo che PHP supporta solo XPath 1.0. @Doug la tua domanda non ha nulla a che fare con XPath. Stai chiedendo come leggere l'output standard 'var_dump'. – Gordon

risposta

2

Se si desidera testo di output all'interno arco è possibile utilizzare textContent proprietà:

echo $ retrieve_data-> punto (1) -> textContent;

+0

Stavo cercando echo '$ retrieve_data-> item (1);' prima. Questo non dovrebbe echeggiare lo span html? Inoltre, dove posso trovare la documentazione per la parte textContent? Non sapevo che puoi farlo. – Strawberry

+0

Proprio come VdesmedT ha detto che l'elemento (1) non è una stringa: è un oggetto Node che può includere molte cose oltre al testo e al nome. La classe base per tutti i nodi è descritta qui (con tutte le proprietà disponibili) qui: http://www.php.net/manual/en/class.domnode.php – Shcheklein

1

se si desidera l'uscita XML (o HTML, piuttosto), provare:

echo $doc->saveXML($retrieve_data->item(1)); 

BTW , lo DOMNodeList, che è il risultato della query, è a base zero indicizzato, quindi il primo elemento sarà 0. Ma forse lo sapevi già.

1

il vostro articolo è oggetto DOMNode, eco la sua nodeValue proprietà potrebbe aiuta

+0

Non ho idea di quello che hai detto. Qual è il suo valore nodeValue? Ti piace oggetto (1)? – Strawberry

+0

echo $ retrieve_data-> item (1) -> nodeValue; – VdesmedT

3
$xpath->evaluate("//span"); 

restituisce un risultato digitato, se possibile, o un DOMNodeList contenente tutti i nodi corrispondenti alla data espressione XPath. Nel tuo caso, restituisce un valore DOMNodeList, perché XPath valuta quattro DOMElements, che sono specializzati DOMNodes. Comprendere il concetto di nodo quando si lavora con qualsiasi XML, indipendentemente dal linguaggio, è cruciale.

echo $retrieve_data->item(1); 

non possono lavorare, perché DOMNodeList::item restituisce un DOMNode e più precisamente un DOMElement nel tuo caso. Gli oggetti echo non possono essere inseriti in PHP se non implementano il metodo __toString(). DOMElement non. Né lo è DOMNodeList. Di conseguenza, si ottiene l'errore fatale che l'oggetto non può essere convertito in stringa.

Per ottenere i valori di DOMElement, leggere il numero nodeValue o textContent.

Alcuni esempi Dom di me: https://stackoverflow.com/search?q=user%3A208809+dom

Problemi correlati