2010-05-13 4 views
3

Я хочу читать записи фида, и я просто застрял сейчас. Возьмем это, например: https://stackoverflow.com/feeds/question/2084883 позволяет сказать, что я хочу прочитать все значение итогового узла внутри каждого входного узла в документе. Как мне это сделать? Я изменил много вариантов кода это один ближе всего к тому, что я хочу достичь, я думаю:Разбор xml с dom4j или jdom или во всяком случае

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")) 

получить только узлы ввода, как я могу получить элементы узлов ввода, и как получить скажем резюме и его значение? Тпй

Вопрос: как получить значение суммарных узлов из this ссылки

+0

Помимо JDOM, вы слышали о vtd-xml? –

+0

@ vtd-xml-author no Я даже не знаю, что это такое – ant

ответ

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

этот код работает, если вы удалите атом: итоговая часть, он петляет через каждую запись и выводит значения дочерних узлов. Вопрос: Как это сделать. Если есть какие-то петли дочерних узлов и получить их значение, если больше нет значений для детей или детей, соберите их значение атрибута else, получите значение атрибута дочернего узла – ant

+0

@ c0mrade: см. Изменение в моем примере кода. – Michael

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

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

Я понятия не имею, является ли ваша проблема (вы на самом деле не заявить, что ваш проблема есть), но никогда идентификация тестовой строки с --. Вместо этого используйте equals():

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

Немного поздно, но это может быть полезно для людей погуглить ...

Eсть специализированный API для работы с лентами RSS и Atom на Java. Это называется Рим, можно найти здесь:

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

достаточно просто.