2010-05-13 62 views
3

我想读取供稿条目,我现在只是卡住了。以此为例:https://stackoverflow.com/feeds/question/2084883可以说我想读取文档中每个入口节点内的所有汇总节点值。我怎么做?我已经改变了很多代码的变化这一个最接近我想要实现我想:用dom4j或jdom解析xml或无论如何

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

它去低谷的所有节点的XML文件,并把他们的名字。现在我想接下来要做的就是

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

只得到了进入节点,如何获取入口节点的元素,以及怎么让说的总结和它的价值? TNX

问题:如何从this链接

+0

除了JDOM,你有没有听说过vtd-xml? – 2010-08-10 23:39:24

+0

@ VTD-XML的作者不,我没有,我不知道那是什么 – ant 2010-08-11 07:52:16

回答

1

这里是你会怎么使用做香草的Java:

//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

如果删除原子此代码的工作:总结部分,它槽循环中的每个条目并打印出子节点的值。问题:如何做到这一点。如果有任何子节点循环并获取它们的值,如果没有更多的子节点或子节点值收集其属性值,则获取子节点属性值 – ant 2010-05-18 08:08:09

+0

@ c0mrade:请参阅编辑我的代码示例。 – Michael 2010-05-19 17:38:23

2

您是否尝试过JDOM得到汇总节点的值?我觉得它更简单和方便。

http://www.jdom.org/

要获得一个XML元素的孩子,你可以做

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

我使用dom4j的,它不是一种选择,对不起 – ant 2010-05-13 15:04:46

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

我不知道这是否是你的问题(你真的不说出你的问题是),但是从来没有测试字符串与--相等。相反,使用equals()

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

晚了一些,但它可能是对谷歌搜索的人有用...

有一个用于处理Java中的RSS和Atom提要的专用API。这就是所谓的罗马,可以在这里找到:

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

这实在是非常有用的,它使易于阅读饲料RSS或Atom版本什么的。您也可以构建提要并使用它生成XML,但我对此功能没有经验。

下面是一个简单的例子,其读取馈送和打印出在饲料中的所有条目的描述节点:

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()); 
} 

够简单。