Парсинг xml с dom4j или jdom или как угодно - PullRequest
3 голосов
/ 13 мая 2010

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

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

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

Вопрос : как получить значения итоговых узлов из этой ссылки

Ответы [ 4 ]

2 голосов
/ 13 мая 2010

Вы пробовали 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...
}
1 голос
/ 14 мая 2010

Вот как вы бы это делали, используя ванильную 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());
}
1 голос
/ 13 мая 2010
if(elem.getName() == "entry")

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

if(elem.getName().equals("entry"))
0 голосов
/ 14 июля 2011

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

Существует специализированный 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());
}

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

...