2015-12-02 85 views
1

我正在使用JSoup解析HTML。它通常工作正常,但在某些明确的示例中,它在解析后更改HTML中的元素序列。这里是简单的代码:JSoup错误地解析了显式HTML

String str1 = originalHtmlFragment; 
Document doc = Jsoup.parseBodyFragment(str1); 
String str2 = doc.html(); 

这里是str1和str2的值。

STR1:

 <table> 
      <tbody> 
       <tr> 
        <th> 
         <p> </p> 
         <p>10</p> 
        </th> 
       </tr> 
       <tr> 
        <td colspan="1"> 
         <p> 
          <ac:macro ac:name="my-macro"> 
           <ac:parameter ac:name="outer-values">Page content</ac:parameter> 
           <ac:parameter ac:name="atlassian-macro-output-type">INLINE</ac:parameter> 
           <ac:rich-text-body> 
            <p>a1</p> 
           </ac:rich-text-body> 
          </ac:macro> 
         </p> 
        </td> 
       </tr> 
      </tbody> 
     </table> 

STR2:

<html> 
    <head></head> 
    <body> 
     <table> 
      <tbody> 
       <tr> 
        <th> 
         <p>&nbsp;</p> 
         <p>10</p> 
        </th> 
       </tr> 
       <tr> 
        <td colspan="1"> 
         <p> 
          <ac:macro ac:name="my-macro"> 
           <ac:parameter ac:name="outer-values">Page content</ac:parameter> 
           <ac:parameter ac:name="atlassian-macro-output-type">INLINE</ac:parameter> 
           <ac:rich-text-body></ac:rich-text-body> 
          </ac:macro> 
         </p> 
         <p>a1</p> 
         <p> 
         </p> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
    </body> 
</html> 

注意,a1为外部AC:在第二个代码示例宏标记。 我如何在JSoup中解决这个问题? 谢谢!

回答

0

由于ac:macro不是允许的标签名称,因此您尝试解析不是真正的HTML的字符串。 JSoup试图做一些明智的事情,但在你的情况下,这显然是失败的。如果您可以切换到XMLparser实现,您会得到预期的结果:

Document doc = Jsoup.parse(str1,"",Parser.xmlParser()); 
+0

它的工作原理!谢谢! –

+0

@AlexeyCe如果你觉得答案对你有帮助,请考虑接受它。这将标志着这个问题的答案。详情请看这里:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – luksch

+0

嗨!是的,我试图投票,但我没有足够的分数。我检查了'v'符号,因为它对我来说是允许的。谢谢! :) –