Newsgroup: it.comp.www.php
Titolo: [PHP 4:] Come prendo solo il primo elemento usando XPath?

 Come prendo solo il primo elemento??
Ciao a tutti,
Vi riporto un frammento del file xml che voglio interrogare con Xpath:
Citazione:
<?xml version="1.0" encoding="UTF-8"?>
<WebSite
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
xmlns="
http://www.dia.uniroma3.it/~volpi/files/database
"
xsi:schemaLocation="
http://www.dia.uniroma3.it/~volpi/files/database
/afs/
vn.uniroma3.it/user/v/volpi/public/public_html/files/database/database.xsd
">
<ResearchGroup
picture="
http://www.dia.uniroma3.it/~compunet/images/compunet_banner.gif
">
<NameGroup>Computer Networks Research Group</NameGroup>
<Description>computer networks</Description>
<Faculty>
www.dia.uniroma3.it
</Faculty>
<Department>
www.web.dia.uniroma3.it
</Department>
<University>
www.uniroma3.it
</University>
<CurrentMember>238651</CurrentMember>
<CurrentMember>238652</CurrentMember>
<CurrentMember>000001</CurrentMember>
<PastMember>238650</PastMember>
<PastMember>000002</PastMember>
<Project>netkit</Project>
<Project>hermes</Project>
<Coordinator>1</Coordinator>
<!-- this publication reference technical-report-->
<Publication>about netkit</Publication>
<Publication>Visualization of the Autonomous Systems Interconnections
with HERMES</Publication>
<!-- this publication reference article -->
<Publication>IPv6-in-IPv4 tunnel discovery: methods and experimental
results</Publication>
<Publication>bgplay</Publication>
<!-- this publication refence Inproceeding -->
<Publication>Algorithms for the Inference of the Commercial
Relationships between Autonomous Systems: Results Analysis and Model
Validation</Publication>
</ResearchGroup>
<ResearchGroup picture="
http://www.inf.uniroma3.it/research/GD.html
">
<NameGroup>Graph Drawing</NameGroup>
<Description>
Algorithm Engineering Research Group
</Description>
<Faculty>
http://www.dia.uniroma3.it/research/ACG.html
</Faculty>
<Department>
http://www.web.dia.uniroma3.it/
</Department>
<University>
http://www.uniroma3.it
</University>
<CurrentMember>1</CurrentMember>
<Project>netkit</Project>
</ResearchGroup>
Con questo script estrapolo le informazioni:
codice PHP:
<?php
    $real_path = realpath("./files/database/database.xml");
    if(!$domdb = domxml_open_file($real_path)){
      die("Error while parsing the document");
      }
    else {
        echo "<CENTER><H3>Xpath Test execute.</H3></CENTER>";
    }
    $xpath = $domdb->xpath_new_context();
    xpath_register_ns($xpath,
'my',"
http://www.dia.uniroma3.it/~volpi/files/database
");
?>
<?php
  $query = "/my:WebSite/my:ResearchGroup/my:NameGroup/text()";
  $xpath_nodeset = $xpath->xpath_eval($query);
  $names = array();
  foreach ($xpath_nodeset->nodeset as $iterator) {
   echo $names[] = $iterator->get_content()."<BR>";
}
?>
ragazzi volevo chiedere:
1. ma come faccio a estrapolare soltanto il primo elemento senza usare
il foreach??
Mi spiego meglio, con il foreach mi stampa:
"Computer Networks Research Group"
"Graphic Drawing"
Ma se voglio soltanto il primo???
non ditemi con l'indice dell'array perchè così ogni volta devo sapere
con certezza la posizione dell'elemento.
Aspetto consigli...Vi ringrazio anticipatamente.
Saluti Simone V.

 con certezza la posizione dell'elemento.
Non ho capito. Questo e' "solo" il primo elemento che ti stampa sopra:
$query = "/my:WebSite/my:ResearchGroup[1]/my:NameGroup";
...altrimenti in quale altro modo puoi identificarlo?
Comunque, alcune risorse che possono darti una mano:
XPath Tutorial:
http://www.zvon.org/xxl/XPathTutorial/General_ita/examples.html
Vd. anche:
http://www.zvon.org/index.php?nav_id=tutorials&mime=html
http://www.zvon.org/index.php?nav_id=references&mime=html
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

No...no....stampa tutti gli elementi richiesti dalla query.
il problema è se voglio solo far visualizzare "Graphic Drawing" che è
il secondo elemento, come faccio?
prima quando non usavo Xpath, usavo la libreria DOM-XML e per
estrapolare i valori degli elementi facevo così:
<?php
       $real_path = realpath("./files/database/database.xml");
	if(!$domdb = domxml_open_file($real_path)){
	  die("Error while parsing the document");
	  }
?>
<?php
	 //comeback the root of node
	 $root = $domdb->document_element();
 	 $node = $root->get_elements_by_tagname("NameGroup");
 	 echo "<CENTER><H1>".$node[1]->get_content()."</H1></CENTER>";
?>
Come puoi vedere gli passavo io a mano l'indice dell'array ma se il
codice si evolverà, bisogna sapere in quale posizione si trova
l'elemento.
capisci che il codice in questo caso fa schifo.
mi puoi aiutare? grazie
Cybertoldo ha scritto:


 mi puoi aiutare? grazie
se riuscissi a capire... forse.
IN QUALE MODO puoi IDENTIFICARE l'elemento che vuoi cercare all'interno 
del file XML.
Vuoi cercare qualcosa tipo:
- testo in NomeNodo = "Graphic Drawing"
- NomeNodo[n_posizione]
- elemento precedente = NomeNodo
- ecc...
Se non e' la posizione che identifica i nodi da te cercati, quale altro 
parametro di ricerca vuoi usare?


Ti chiedo scusa per prima cosa, perchè non riesco ad esprimermi in
modo opportuno e disgnitoso :-P
La cosa che voglio fare con XPath è nella query voglio dire
selezionami tutto il testo contentuto dall'elemento ResearchGroup che
ha il nome uguale a Graphic Drawing.
Quindi, come puoi vedere dal file xml riportato sopra:
es:
$query = "/my:WebSite/my:ResearchGroup/my:NameGroup = "Graphic
Drawing"/text()";
Dovrebbe darmi questo output nella pagina php
Algorithm Engineering Research Group
ttp://
www.dia.uniroma3.it/research/ACG.html
http://www.web.dia.uniroma3.it/
http://www.uniroma3.it
1
netkit
Spero di essere stato chiaro adesso.
Ti prego se non hai ancora capito, dimmi che cosa..
non sò proprio a chi rivolgermi.
Grazie 1000.
Simone V.
Cybertoldo ha scritto:


Drawing"/text()";
Ciao Simone,
non ti ho risp in privato perchè riprendo ora il pc: vedo che con i 
namespace
hai risolto.
Qui potresti fare qualcosa del genere:
"/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graphic Drawing']"
--
f

Ciao Fabio, non ti preoccupare.....:-)
Alla fine lavorandoci non sò per quante ore sembra che tutto
funzioni!!!
Spero che non era un danno importante al tuo calcolatore.
Immaginavo che tu sapevi qualcosa al riguardo!!!!!!
Ho provato ma in output non ottengo nulla, mi da soltanto la scritta
XPath Execute.
Ecco il codice php:
<?php
	$real_path = realpath("./files/database/database.xml");
	if(!$domdb = domxml_open_file($real_path)){
	  die("Error while parsing the document");
	  }
	else {
		echo "<CENTER><H3>Xpath Test execute.</H3></CENTER>";
	}
	$xpath = $domdb->xpath_new_context();
	xpath_register_ns($xpath,
'my',"
http://www.dia.uniroma3.it/~volpi/files/database
");
?>
<?php
  $query = "/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graphic
Drawing']";
  $xpath_nodeset = $xpath->xpath_eval($query);
  foreach ($xpath_nodeset->nodeset as $iterator) {
    echo $names[] = $iterator->get_content()."<BR>";
}
?>
Sai darmi una mano, grazie!
Fabio Fidanza ha scritto:


Scusami Fabio.....ti dico subito dove era l'errore!!!!
il problema era nella stringa di confronto che era scritta in modo
diverso che dal file xml.
Sono proprio di coccio :-P
Scusami ma se voglio stampare solo il nome del gruppo di ricerca in
questo caso Graph Drawing...faccio così:
<?php
  $query = $query =
"/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graph Drawing']";
  $xpath_nodeset = $xpath->xpath_eval($query);
  $it[] = $xpath_nodeset->nodeset;
  echo $it->get_content(); <- ma mi da errore qui
?>
perchè php mi dice che non va bene.. :-(
Simone V. ha scritto:


perchè php mi dice che non va bene.. :-(
Il nodeset è vuoto?
Prova a fare una print_r su $it

Se faccio questo script:
<?php
  $query = $query
="/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graph Drawing']";
  $xpath_nodeset = $xpath->xpath_eval($query);
  $it[] = $xpath_nodeset->nodeset;
  print_r($it);
?>
Mi dice:
Array ( [0] => Array ( [0] => domelement Object ( [type] => 1 [tagname]
=> ResearchGroup [0] => 3 [1] => 9126208 ) ) )
e mi sembra che il nodeset non sia vuoto o sbaglio???!!
Fabio Fidanza ha scritto:


Prova:
  $it[] = $xpath_nodeset->nodeset;
  echo $it[0]->nodeValue
--
f 

niente....
rimasto tutto immutato. il codice si esegue ma visualizza soltanto
XPath Execute....
se provo con get_content() mi solleva il warning al debug...
Fabio Fidanza ha scritto:


 perchč php mi dice che non va bene.. :-(
ciao


 > perchè php mi dice che non va bene.. :-(


Drawing
(se GraphDrawing lo passi come parametro non capisco la ragione
di ottenerlo nuovamente indietro)
cmq:
/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graph 
Drawing']/my:NameGroup

 ="/my:WebSite/my:ResearchGroup[child::my:NameGroup='Graph Drawing']";
...allora imposta l'xpath giusto per stampare solo 'Graph Drawing':
$query = "/my:WebSite/my:ResearchGroup[my:NameGroup='Graph 
Drawing']/my:NameGroup";
PS: (ma ascoltami, pero') fatti 'sto tutorial: 
http://www.zvon.org/xxl/XPathTutorial/General_ita/examples.html
Si', ci vorranno 15/20 min.... ma poi risparmi tanto tempo passato a 
sperimentare soluzioni a caso :-)


 di ottenerlo nuovamente indietro)
...anche questa e' una bella domanda :-)


Avete perfettamente ragione!
Infatti tutta questa notte mi sono studiato il tutorial(FATTO
BENISSIMO) consigliato da Cybertoldo e sembra che adesso le cose vadano
meglio.
Vi ringrazio sentitamente per  tutte le risposte e il tempo dedicatomi
in questo topic.
Buona giornata a tutti Voi.
Saluti Simone V.
