2015-12-02 86 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'符號,因爲它對我來說是允許的。謝謝! :) –