2010-06-03 8 views
1

Étant donné le document xml suivant (en supposant que plus de livres sont alors listés) et en utilisant l'implémentation java de xpath. Quelle expression utiliser pour trouver un ensemble unique de noms d'auteur?Obtention d'un ensemble unique avec javas xpath

<inventory> 
    <book year="2000"> 
     <title>Snow Crash</title> 
     <author>Neal Stephenson</author> 
     <publisher>Spectra</publisher> 
     <isbn>0553380958</isbn> 
     <price>14.95</price> 
    </book> 

    <book year="2005"> 
     <title>Burning Tower</title> 
     <author>Larry Niven</author> 
     <author>Jerry Pournelle</author> 
     <publisher>Pocket</publisher> 
     <isbn>0743416910</isbn> 
     <price>5.99</price> 
    </book> 

    <book year="1995"> 
     <title>Zodiac</title> 
     <author>Neal Stephenson</author> 
     <publisher>Spectra</publisher> 
     <isbn>0553573862</isbn> 
     <price>7.50</price> 
    </book> 

    <!-- more books... --> 

</inventory> 
+1

Les xpaths peuvent-ils faire cela? Je vais juste sortir les auteurs et les mettre dans un ... (attendez) ... Set. – CPerkins

+0

@CPerkins, vous et moi avons eu la même idée :) –

+0

Je cherche des moyens d'extraire les données nécessaires à partir de services Web préexistants. Dans ce cas, je cherche à extraire des ensembles de données uniques pour faciliter les fonctions de filtrage. Si c'était un cas où je pourrais obtenir toutes les données nécessaires pré-formatées exactement comme je le voulais tout le temps. Je suppose que je pourrais faire disparaître xpath dans son intégralité. Mais dans ce cas je ne vais pas pouvoir faire ça. –

Répondre

5
Set<String> uniqueAuthors = new HashSet<String>(); 
XPathFactory factory = XPathFactory.newInstance(); 
XPath xPath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//book/author/text()"); 
NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0; i < nodes.getLength(); ++i) { 
    uniqueAuthors.add(nodes.item(i).getNodeValue()); 
} 

J'ai utilisé l'excellent article "The Java XPath API" comme référence. XPath Version 1.0 ne peut pas, en général, sélectionner des valeurs distinctes, donc j'ai inséré les auteurs dans un Set. À la fin de la boucle for, l'ensemble contiendra tous les auteurs.

+0

+1 Mais je me demande pourquoi les données d'échantillon dans l'OP sont exactement les mêmes que dans l'article lié. – stacker

+0

Ce serait parce que j'ai pris les données d'échantillon du même article. La solution donnée ici (qui n'est pas dans l'article) est une bonne solution mais pas tout à fait ce que je cherchais, j'espérais déterminer s'il y avait une requête xpath elle-même qui retourne un ensemble unique, pas si je pouvais en extraire ensemble unique d'une requête. –

+0

@J E Bailey: XPath n'a aucun moyen de sélectionner un ensemble de valeurs uniques. Cependant, XQuery fait: http://www.xqueryfunctions.com/xq/fn_distinct-values.html –

Questions connexes