2012-10-14 15 views
5

Ho un file XML come il seguente:Come ottenere un elemento dal valore del suo attributo usando JDOM?

<?xml version="1.0" encoding="UTF-8" ?> 
<config> 
    <admins> 
     <url name="Writer Admin">http://www.mywebsite.com/admins?cat=writer</url> 
     <url name="Editor Admin">http://www.mywebsite.com/admins?cat=editor</url> 
    </admins> 
    <users> 
     <url name="Critic User">http://www.mywebsite.com/users?cat=critic</url> 
     <url name="Reviewer User">http://www.mywebsite.com/users?cat=reviewer</url> 
     <url name="Reader User">http://www.mywebsite.com/users?cat=reader</url> 
    </users> 
</config> 

Come posso selezionare gli elementi "URL" per il valore del loro "nome" attributi usando la libreria JDOM in java? C'è un modo semplice o devo selezionare tutti gli elementi figlio e controllare l'elemento desiderato utilizzando un ciclo "for"? Esiste qualche approccio come Linq in .Net?

risposta

5

XPath è tuo amico ... se si utilizza JDOM 2.x è più facile che JDOM 1.x, quindi, int JDOM 2.x sarà qualcosa del tipo:

String query = "//*[@name= 'Critic User']"; 
XPathExpression<Element> xpe = XPathFactory.instance().compile(query, Filters.element()); 
for (Element urle : xpe.evaluate(mydoc)) 
{ 
    System.out.printf("This Element has name '%s' and text '%s'\n", 
      urle.getName(), urle.getValue()); 
} 

XPath è una "bestia diversa", ma rende alcune cose (come questa), un intero mucchio più facile da scrivere.

La "query" sopra riportata in pratica dice: Trova tutti gli elementi nel documento che hanno un attributo chiamato "nome" e il valore dell'attributo nome è "Utente critico".

Regolare a piacere, e leggere il tutorial XPath: http://www.w3schools.com/xpath/default.asp

Edit: Naturalmente, una query migliore sarebbe: // url [@ name = 'Critico d'uso']

+1

Se la prestazione non è un problema, XPath è probabilmente la strada da percorrere. Puoi afferrare elementi specifici in modo molto selettivo. Ma anche se il loop su tutti gli elementi può sembrare eccessivo, di solito si esegue molto più velocemente. In cima, in un'applicazione reale, finirai per utilizzare comunque più informazioni del file XML originale. –

+0

grazie per il vostro tempo e considerazione. :-) – moorara

0

Grazie molto per quella. Ho appena notato che rolfl ha invertito l'ordine degli argomenti nel metodo di compilazione. XPathFactory.instance().compile(query, Filters.element()); anziché XPathFactory.instance().compile(Filters.element(), query); Buon lavoro tuttavia ...

Problemi correlati