jsoup 删除外部 html 标签 - 代码 HTML 元素

jsoup remove outer html tag - code HTML element

这看起来很简单,但显然我做错了什么。这是我的 HTML - 我正在尝试在 pre 标签下创建单个代码标签和嵌套代码标签 - 结果内容将是 "one line boxes with code inside" 并且还有 pre 标签 "big boxes with code inside"。还有一些空段落标签,我无法使用标准方法摆脱它们 - 在测试段落中没有文本后删除元素。这是输入

        <h1>Module Description and Learning Objectives</h1>  
        <p> 
        </p> 
        <pre>                
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
        </p>
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
        </p>
        <p>
        <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
        </p>
        <p>
        </p>
        </pre> 
        <p>Sentence 1</p> 
        <p> 
        <code>System.out.println("id:"+element.attr("id"));</code> 
        </p> 
        <p>Sentence 2</p> 
        <p> 
        <code>System.out.println("src:"+element.attr("src"));</code> 
        </p> 
        <p>Sentence 3</p> 
        <p> 
        <code>System.out.println("alt:"+element.attr("alt"));</code> 
        </p> 
        <p> 
        </p> 

这是我的代码(不要像构造一样遵循名称,中间代码名称:)

          Elements pWithCodeTagList = docXMLformat.select("code");
          if (pWithCodeTagList.size() > 0) {
              for (Element pTag : pWithCodeTagList) {
                   System.out.println("pTag=" + pTag.text() + " " + pTag.tagName());
                   pTag.unwrap();
              }
          }

这是 eclipse 中的输出 - 我确实选择了代码标签并期望父 p 消失

 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - code
 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title code
 pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1 code
 pTag=System.out.println("id:"+element.attr("id")); code
 pTag=System.out.println("src:"+element.attr("src")); code
 pTag=System.out.println("alt:"+element.attr("alt")); code

这是结果:我希望段落标签消失,而不是代码标签!

   <h1>Module Description and Learning Objectives</h1> 
                <p> 
                </p> 
                <pre>                
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 -
                </p>
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title
                </p>
                    <p>
                    2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1
                </p>
                    <p>
                    </p>
                </pre> 
                <p>Sentence 1</p> 
                <p> System.out.println("id:"+element.attr("id")); </p> 
                <p>Sentence 2</p> 
                <p> System.out.println("src:"+element.attr("src")); </p> 
                <p>Sentence 3</p> 
                <p> System.out.println("alt:"+element.attr("alt")); </p> 
                <p> 
                </p> 

我已经触及了文档的这个区域,在此之前我已经删除了代码标签周围的 span 标签,并且不得不从行内容中删除所有行控制字符,也许 PRE 和 CODE 没有像其他标签一样工作 - 我知道他们不应该这样做,但是......另外,我试图将标签和内容保持在同一行所以我的 "code boxes" 尽可能苗条,towit:

 <pre>                
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
 <code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
  </pre> 
  <p>Sentence 1</p> 
  <code>System.out.println("id:"+element.attr("id"));</code> 
  <p>Sentence 2</p> 
  <code>System.out.println("src:"+element.attr("src"));</code> 
  <p>Sentence 3</p> 
  <code>System.out.println("alt:"+element.attr("alt"));</code> 

您的 select 或正在 selecting code 元素,而不是 p 元素,这就是它们被删除的原因。您应该 select 具有 code 标签的 p 元素,以及 unwrap() 那些元素。 p:has(code)

此外,如果您想将它们全部展开,则不需要对它们进行迭代并在每个上调用展开(除非您想为每个执行额外的逻辑)。你可以打电话给 Elements#upwrap()

Elements pWithCodeTagList = docXMLformat.select("p:has(code)");
pWithCodeTagList.unwrap();

要查找空的 p 标签,您可以使用 :matches select 或者对文本执行正则表达式,只查找空格或不查找任何内容:p:matches(^\s?$)

Elements emptyPs = docXMLformat.select("p:matches(^\s?$)");
emptyPs.remove();