2010-02-12 4 views
1

Voici un fichier xml exemple que je suis en train de tirer des données à partir de:expression XPath pour revenir valeur basée sur la valeur des frères et soeurs

<rss> 
<channel> 
    <item> 
    <title>First Title</title> 
    <description>description text</description> 
    <component>Distribution - Maintain</component> 
    <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate> 
    <timespent seconds="1860">31 minutes</timespent> 
    </item> 
    <item> 
    <title>Second Title</title> 
    <description>description text</description> 
    <component>Reporting - Security</component> 
    <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate> 
    <timespent seconds="1860">31 minutes</timespent> 
    </item> 
    <item> 
    <title>third Title</title> 
    <description>description text</description> 
    <timeoriginalestimate seconds="5400">1 hour, 30 Minutes</timeoriginalestimate> 
    <timespent seconds="2700">45 minutes</timespent> 
    </item> 
    <item> 
    <title>Fourth Title</title> 
    <description>description text</description> 
    <component>Usability</component> 
    </item> 
    <item> 
    <title>Fifth Title</title> 
    <description>description text</description> 
    <component>Distribution - Maintain</component> 
    <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate> 
    <timespent seconds="7200">2 hours</timespent> 
    </item> 
</channel> 
</rss> 

Je veux recueillir les timeoriginalestimate et timespent nœuds par component valeur. Je veux stocker la valeur du component soit dans une carte ou un hachage comme la clé et la valeur à la différence totale de timeoriginalestimate et timespent

K = « Distribution - maintain » V = 2heures-2hours31minutes

certains des item « s ne sera pas un component et quelques-uns des component » s auront pas les valeurs de temps. Dans ce cas, j'aimerais que les valeurs temporelles viennent s'ajouter au total cumulé pour un composant «autre». J'écris ceci dans java et j'ai l'intention d'imprimer un rapport qui montrera combien de temps a été estimé par rapport au temps réellement passé par chaque composant. Je ne suis pas sûr de savoir comment s'y prendre.

Toute aide serait grandement appréciée. Merci!

Exemple de code pour compter les occurrences d'une valeur:

private XPath featureXPath = XPath.newInstance("count(//rss/channel/item/type[text()='New Feature'])"); 
LinkedHashMap<String, Double> metrics = new LinkedHashMap<String, Double>(); 
metrics.put("New Features", (Double)featureXPath.selectSingleNode(doc)); 

Je ne suis pas sûr de savoir comment je peux ajouter les valeurs de temps à une clé inconnue et ajouter que les valeurs de temps pour que leur clé

respective
+0

Un code de votre côté que vous avez essayé? –

+0

J'ai ajouté un peu de code qui a fonctionné pour accomplir une tâche différente ... cela me dira juste le nombre de fois qu'un type d'élément a la valeur de "nouvelle fonctionnalité". – robbie

Répondre

0

Vous posez deux questions ici, je pense - (1) comment obtenir les chaînes et les nombres de votre document avec XPath, et (2) comment traiter les cas avec des données manquantes. Je ne suis pas clair sur ce que vous voulez faire avec (2) les données manquantes. Votre exemple inclut un item qui n'a aucune information de temps, pas même un timespent - Je ne sais pas comment vous voulez gérer cela.

Le code ci-dessous gère l'extraction et les mathématiques (1). Faire la soustraction dans XPath me permet de faire 2 appels XPath au lieu de 3. J'utilise une évaluation immédiate pour garder les expressions XPath proches de l'endroit où je les utilise - cela me semble plus clair. Vous pouvez les sortir de la boucle et les compiler en utilisant xpath.compile() pour éviter de les recompiler à chaque itération si votre profilage montre des économies significatives.

XPath xpath = XPathFactory.newInstance().newXPath(); 
// find all <item>s, regardless of missing data 
NodeList items = (NodeList)xpath.evaluate("/rss/channel/item", 
              doc, 
              XPathConstants.NODESET); 
for (int i=0; i<items.getLength(); i++) { 
    Node item = items.item(i); 
    // this evaluates to true when all three child elements are present 
    // adjust to suit your needs 
    if ((Boolean)xpath.evaluate 
     ("component and timeoriginalestimate and timespent", 
     item, XPathConstants.BOOLEAN)) { 
     // handle the "normal" case 
     String component = (String)xpath.evaluate 
      ("component", item, XPathConstants.STRING); 
     Double time = (Double)xpath.evaluate 
      ("timeoriginalestimate/@seconds - timespent/@seconds", 
      item, XPathConstants.NUMBER); 
     map.put(component, time); 
    } else { 
     // handle the "other" case 
    } 
} 
Questions connexes