2012-10-14 15 views
5

Mam plik xml podobny do następującego:Jak uzyskać element według wartości jego atrybutu za pomocą 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> 

Jak mogę wybrać „URL” elementy według wartości ich atrybutów „nazwa” JDOM wykorzystaniem biblioteki w Java? Czy jest jakiś prosty sposób, czy muszę wybrać wszystkie elementy potomne i sprawdzić pożądany element za pomocą pętli "for"? Czy istnieje jakieś podejście, takie jak Linq w .Net?

Odpowiedz

5

XPath jest twoim przyjacielem ... jeśli używasz JDOM 2.x jest łatwiejsze niż JDOM 1.x, tak, int JDOM 2.x będzie to coś jak:

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 jest "inna bestia", ale sprawia, że ​​niektóre rzeczy (jak ta) są łatwiejsze do pisania.

Powyższe "zapytanie" w zasadzie mówi: Znajdź wszystkie elementy w dokumencie, które mają atrybut o nazwie "nazwa", a wartością atrybutu nazwy jest "Krytyczny użytkownik".

Dostosowanie do smaku, i zapoznania się z samouczkiem XPath: http://www.w3schools.com/xpath/default.asp

Edit: Oczywiście, lepiej byłoby zapytania: // url [@ name = 'Krytyk Użytkownika']

+1

Jeśli wydajność nie jest problemem, XPath jest prawdopodobnie najlepszym rozwiązaniem. Możesz pobierać określone elementy bardzo selektywnie. Ale nawet jeśli pętla nad wszystkimi elementami może wydawać się nadmierna, zwykle działa znacznie szybciej. Na samym początku, w aplikacji z prawdziwego świata, w końcu wykorzystasz więcej informacji o oryginalnym pliku XML. –

+0

dziękuję za poświęcony czas i uwagę. :-) – moorara

0

podziękować za dużo że. Właśnie zauważyłem, że rolfl odwrócił kolejność argumentów w metodzie kompilacji. XPathFactory.instance().compile(query, Filters.element()); zamiast XPathFactory.instance().compile(Filters.element(), query); Dobra robota jednak ...

Powiązane problemy