2010-05-13 6 views
3

Je veux lire les entrées de flux et je suis juste coincé maintenant. Prenez ceci par exemple: https://stackoverflow.com/feeds/question/2084883 disons que je veux lire toute la valeur du nœud récapitulatif à l'intérieur de chaque nœud d'entrée dans le document. Comment je fais ça? J'ai changé de nombreuses variantes de code celui-ci est le plus proche de ce que je veux réaliser, je pense:Analyser xml avec dom4j ou jdom ou de toute façon

Element entryPoint = document.getRootElement(); 
    Element elem; 
    for(Iterator iter = entryPoint.elements().iterator(); iter.hasNext();){ 
    elem = (Element)iter.next(); 
        System.out.println(elem.getName()); 
    } 

Il va tous les nœuds creux dans le fichier xml et écrit leur nom. Maintenant, ce que je voulais faire ensuite est

if(elem.getName().equals("entry")) 

pour obtenir uniquement les nœuds d'entrée, comment puis-je obtenir des éléments des noeuds d'entrée, et comment obtenir et laisser dire résumé sa valeur? TNX

Question: comment obtenir des valeurs des noeuds de synthèse de this lien

+0

En dehors de JDOM, avez-vous entendu parler de vtd-xml? –

+0

@ vtd-xml-auteur non je ne sais pas ce que c'est – ant

Répondre

1

Voilà comment vous le feriez en utilisant Java vanille:

//read the XML into a DOM 
StreamSource source = new StreamSource(new StringReader("<theXml></theXml>")); 
DOMResult result = new DOMResult(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.transform(source, result); 
Node root = result.getNode(); 

//make XPath object aware of namespaces 
XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setNamespaceContext(new NamespaceContext(){ 
    @Override 
    public String getNamespaceURI(String prefix) { 
     if ("atom".equals(prefix)){ 
      return "http://www.w3.org/2005/Atom"; 
     } 
     return null; 
    } 

    @Override 
    public String getPrefix(String namespaceURI) { 
     return null; 
    } 

    @Override 
    public Iterator getPrefixes(String namespaceURI) { 
     return null; 
    } 
}); 

//get all summaries 
NodeList summaries = (NodeList) xpath.evaluate("/atom:feed/atom:entry/atom:summary", root, XPathConstants.NODESET); 
for (int i = 0; i < summaries.getLength(); ++i) { 
    Node summary = summaries.item(i); 

    //print out all the attributes 
    for (int j = 0; j < summary.getAttributes().getLength(); ++j) { 
     Node attr = summary.getAttributes().item(j); 
     System.out.println(attr.getNodeName() + "=" + attr.getNodeValue()); 
    } 

    //print text content 
    System.out.println(summaries.item(i).getTextContent()); 
} 
+0

ce code fonctionne si vous enlevez atome: partie sommaire, il boucle chaque entrée et imprime les valeurs des nœuds enfants. Question: Comment faire cela. Si des nœuds enfants sont en boucle et obtiennent leur valeur, s'il n'y a plus d'enfants ou d'enfants, les valeurs collectent leur valeur d'attribut. Sinon, obtenez la valeur d'attribut du nœud enfant – ant

+0

@ c0mrade: Voir l'exemple de modification de mon code. – Michael

2

Avez-vous essayé jdom? Je le trouve plus simple et pratique.

http://www.jdom.org/

Pour tous les enfants d'un élément XML, vous pouvez juste faire

SAXBuilder sb = new SAXBuilder(); 
      StringReader sr = new StringReader(xmlDocAsString); 
      Document doc = sb.build(sr); 
      Element root = doc.getRootElement(); 
      List l = root.getChildren("entry"); 
      for (Iterator iter = l.iterator(); iter.hasNext();) { 
...//do whatever... 
} 
+0

J'utilise dom4j, ce n'est pas une option désolé – ant

1
if(elem.getName() == "entry") 

Je ne sais pas si cela est votre problème (vous ne déclarez pas vraiment ce que votre problème est), mais jamais égalité de chaîne de test avec --. Au lieu de cela, utilisez equals():

if(elem.getName().equals("entry")) 
0

Un peu en retard, mais il pourrait être utile pour les personnes googler ...

Il est une API spécialisée pour traiter les flux RSS et Atom en Java. Il est appelé Rome, se trouve ici:

http://java.net/projects/rome/

Il est vraiment très utile, il rend facile la lecture du flux RSS quel que soit le ou la version Atom. Vous pouvez également créer des flux et générer le XML avec, même si je n'ai aucune expérience avec cette fonctionnalité.

Voici un exemple simple qui lit un flux et imprime les noeuds de description de toutes les entrées de l'alimentation:

URL feedSource = new URL("http://...."); 
feed = new SyndFeedInput().build(new XmlReader(feedSource)); 
List<SyndEntryImpl> entries = (List<SyndEntryImpl>)feed.getEntries(); 

for(SyndEntryImpl entry : entries){ 
    System.out.println(entry.getDescription().getValue()); 
} 

assez simple.

Questions connexes