【问题标题】:Append the XML/HTML tag only if it's outside of a particular tag. JAVA/JSOUP仅当 XML/HTML 标记在特定标记之外时才附加它。 JAVA/JSOUP
【发布时间】:2019-10-23 09:40:55
【问题描述】:

有两种情况:

  1. 如果<if> 标记出现在<except> 标记之外,则附加<print> 标记,并将</print> 标记附加到相应的</if> 标记。

  2. 如果<print>标签已经关联<if>标签,则无需再次添加。

输入的 XML 是:

<if>
  <except>
    <if>
      <except>
        <if />
      </except>
    </if>
  </except>
</if>

预期的输出应该是:

<if>
  <print>
    <except>
      <if>
        <except>
          <if />
        </except>
      </if>
    </except>
  </print>
</if>

我能做些什么来实现这一目标?

【问题讨论】:

  • 您是否只想将except 视为任何父母的直接父母?
  • 我改进了 HTML 代码的格式并添加了最后一个问题。不过,最后一个问题应该进一步完善。

标签: java html parsing jsoup


【解决方案1】:

cmets 中的解释:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;

public class StackOverflow58484337 {

    public static void main(String[] args) {
        String html = "<if><except><if><except><if /></except></if></except></if>";
        Document doc = Jsoup.parse(html, "", Parser.xmlParser());
        // select every "if" element
        Elements ifs = doc.select("if");
        System.out.println("--- before:");
        System.out.println(doc);
        // check every "if" element if any of its parents is "except" element
        for (Element singleIf : ifs) {
            if (isOutsideExcept(singleIf)) {
                // wrap it in "print" element
                singleIf.children().wrap("<print>");
            }
        }
        System.out.println("--- after:");
        System.out.println(doc);
    }

    private static boolean isOutsideExcept(Element singleIf) {
        Element parent = singleIf.parent();
        // check parent, and parent of his parent, and parent of his parent ...
        while (parent != null) {
            if (parent.tagName().equals("except")) {
                return false;
            }
            parent = parent.parent();
        }
        return true;
    }

}

输出:

--- before:
<if>
 <except>
  <if>
   <except>
    <if />
   </except>
  </if>
 </except>
</if>
--- after:
<if>
 <print>
  <except>
   <if>
    <except>
     <if />
    </except>
   </if>
  </except>
 </print>
</if>

【讨论】:

  • 谢谢!,它按预期工作。对于案例 2,我只是在 for 循环中添加了一个条件,现在它可以正常工作了。
  • 如果你喜欢这个答案记得mark it as accepted。
  • 对于提供的情况,它的失败:输入:&lt;IF&gt;&lt;A&gt;&lt;/A&gt;&lt;P&gt;&lt;/P&gt;&lt;Q&gt;&lt;S&gt;&lt;/S&gt;&lt;A&gt;&lt;/A&gt;&lt;/Q&gt;&lt;/IF&gt; 输出:&lt;IF&gt;&lt;PRINT&gt;&lt;A&gt;&lt;/A&gt;&lt;/PRINT&gt;&lt;PRINT&gt;&lt;P&gt;&lt;/P&gt;&lt;/PRINT&gt;&lt;PRINT&gt;&lt;Q&gt;&lt;S&gt;&lt;/S&gt;&lt;A&gt;&lt;/A&gt;&lt;/Q&gt;&lt;/PRINT&gt;&lt;/IF&gt; 预期输出:&lt;IF&gt;&lt;PRINT&gt;&lt;A&gt;&lt;/A&gt;&lt;P&gt;&lt;/P&gt;&lt;Q&gt;&lt;S&gt;&lt;/S&gt;&lt;A&gt;&lt;/A&gt;&lt;/Q&gt;&lt;/PRINT&gt;&lt;/IF&gt;。我该如何解决这个问题。
  • 小写 if 与大写 IF 不同。这可能就是 select 找不到它的原因。
  • 在选择中我只给出了大写的IF,在这种情况下我也得到了上面提到的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2020-07-26
  • 2012-12-20
  • 2016-09-19
  • 1970-01-01
  • 2017-11-03
  • 2021-12-07
相关资源
最近更新 更多