在JSoup中获取基于父元素的元素

时间:2012-06-05 04:49:34

标签: java html parsing jsoup

在以下XML中,我希望能够获取第一个标题标记的内容,而不是第二个。不幸的是,代码打印了两个标题标签的内容......

任何帮助都会非常感谢!

String feedXMLString = "<entry><title>title 1</title><source><title>title 2</title></source></entry>";
    Document feedXML = Jsoup.parse(feedXMLString);

    NodeTraversor feedXMLTraversor = new NodeTraversor(new NodeVisitor() {

          @Override
          public void tail(Node node, int depth) {
              if (node instanceof Element) {

                  String tagName = ((Element) node).tagName();                    
                  String parentTagName = ((Element) node).parent().tagName();

                  if (tagName.equals("title")) {          
                      if (parentTagName.equals("entry")) {
                          String title = ((Element) node).ownText();
                          System.out.println(title);
                      }
                  }
              }
          }

          @Override
          public void head(Node node, int depth) { 
          }
        });
    feedXMLTraversor.traverse(feedXML.body());

输出

title 1
title 2

我只是想让它成为标题1.我假设第二个标题的父标签是<source>,但由于某种原因,JSoup似乎认为它是<entry>

谢谢!

谢谢!

2 个答案:

答案 0 :(得分:2)

为什么不使用Jsoup API的选择器部分?它使用起来要容易得多,它更干净,而且我愿意打赌它也会更快。我个人使用的是:

//The line you already had
Document doc = Jsoup.parse(feedXMLString);

//This will get you all the titles
Elements elems = doc.select("title");

//And now you can proceed in various ways:
String title1stWay = elems.first().text();
String title2ndWay = elems.get(0).text();

看看这里:Jsoup Selector API

答案 1 :(得分:1)

尝试添加(String tagName ,String parentTagName...以下)

int numOfParents = ((Element) node).parents().size();

并改变

if (parentTagName.equals("entry"))

if (parentTagName.equals("entry") && (numOfParents == 1))