【问题标题】:Get element based on parent in JSoup基于JSoup中的父元素获取元素
【发布时间】:2012-06-05 19:16:10
【问题描述】:

在下面的 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。我假设第二个标题的父标签是 &lt;source&gt;,但出于某种原因 JSoup 似乎认为它是 &lt;entry&gt;

谢谢!

谢谢!

【问题讨论】:

    标签: java html parsing jsoup


    【解决方案1】:

    为什么不使用 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

    【讨论】:

    • 酷。这样做:元素 entryElements = feedXML.select("entry");迭代器 entryIterator = entryElements.iterator(); while(entryIterator.hasNext()) { 元素 entryElement = entryIterator.next(); System.out.print(entryElement.select("title").first().ownText()); }
    • 好吧,如果你放一个 first();循环内的方法,它不会对你有任何好处。你应该使用 first();在循环之外,或者使用 iterator.next();将返回分配给元素的方法
    【解决方案2】:

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

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

    改变

    if (parentTagName.equals("entry"))
    

    进入

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

    ?

    【讨论】:

    • JSoup 添加 html 和 body 标签。但是,如果我为每个元素打印 numbOfParents,我仍然会得到:“title 3 source 3 title 3 entry 2 body 1” 似乎 JSoup 解析不正确?两个头衔怎么会有相同数量的父母?
    • 尝试打印((Element) node).parents() 并查看两个标题的父母是否相同...
    • 是的,它们都有相同的父级、条目正文和 html。如果我将源标签更改为 div 标签,则程序按预期工作。我只能猜测 JSoup 正在从 DOM 中删除源标签,可能是因为它认为它们是多余的。有什么方法可以防止这种情况吗?或者其他区分两个标题标签的方法?我想如果情况变得更糟,我可以只取每个条目中找到的第一个标题标签......
    • 这很奇怪......好吧,我不是 jsoup Pro。所以可能还有其他技巧
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2011-11-24
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多