2013-12-20 147 views
3

我使用Jsoup來將剪貼板值解析爲html代碼,但它不適用於subscriptsuperscript。舉一個例子:Jsoup爲下標和上標解析html


你好世界(HTML:<b>Hello <sup>World</sup></b>


你好世界(HTML:<b>Hello <sub>World</sub></b>

代碼

result = rtfToHtml(new StringReader(streamToString((InputStream) contents.getTransferData(dfRTF)))); 

的Resul對於上面的例子是:

<html> 
    <head> 
    <style> 
     < !-- 
     p.default { 
      size:3; 
      family:sansserif; 
      foreground:#000000; 
      bold:normal; 
      italic:; 
     } 
     -- > 
    </style> 
    </head> 
    <body> 
    < p class=default > 
     < span style="color: #000000; font-size: 14pt; font-family: ArialMT"> 
     < b>Hello < /b> 
     < /span> 
     < span style="color: #000000; font-size: 11pt; font-family: ArialMT"> 
     < b>World< /b> 
     < /span> 
    < /p> 
    < /body> 
< /html> 

任何知道如何才能使用Jsoup處理SuperscriptSubscript。任何意見或引用高度讚賞。

編輯

 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     Transferable contents = clipboard.getContents(null); 
     DataFlavor dfRTF = new DataFlavor("text/rtf", "Rich Formatted Text"); 
     DataFlavor dfTxt = DataFlavor.stringFlavor; 

     boolean hasTransferableRTFText = (contents != null) 
       && contents.isDataFlavorSupported(dfRTF); 
     boolean hasTransferableTxtText = (contents != null) 
       && contents.isDataFlavorSupported(dfTxt); 
if (hasTransferableRTFText) { 
      try { 
result = rtfToHtml(new StringReader(streamToString((InputStream) contents.getTransferData(dfRTF)))); 
Document doc = Jsoup.parse(result); 
} 
} 

編輯

public static String rtfToHtml(Reader rtf) throws IOException { // From http://www.codeproject.com/Tips/136483/Java-How-to-convert-RTF-into-HTML 
     JEditorPane p = new JEditorPane(); 
     p.setContentType("text/rtf"); 
     EditorKit kitRtf = p.getEditorKitForContentType("text/rtf"); 
     try { 
      kitRtf.read(rtf, p.getDocument(), 0); 
      kitRtf = null; 
      EditorKit kitHtml = p.getEditorKitForContentType("text/html"); 
      Writer writer = new StringWriter(); 
      kitHtml.write(writer, p.getDocument(), 0, p.getDocument().getLength()); 
      return writer.toString(); 
     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
+0

當前的問題沒有包含足夠的細節。 什麼是'rtfToHtml'? Jsoup將所有轉換爲期望的,但你的問題是在rtfToHtml函數。它是[this](http://www.codeproject.com/Tips/136483/Java-How-to-convert-RTF-into-HTML)? – msangel

+0

@msangel編輯我的問題 –

回答

2

您的問題與JSoup無關,但與您的rtfToHtml函數無關。

您的功能不會生成您期望的標籤<sub>和<sup>。 JSoup無法做任何事情,因爲預期的標籤不在這裏,所以你不能解析它們。

編輯:(和解決方案)

您應該跳過你的rtfToHTML一步的時候沒有必要。如果剪貼板包含已經以HTML格式存在的數據,那麼在rtf中請求它然後將其轉換回HTML意味着轉換期間格式信息的丟失。

您可以直接在HTML格式獲取剪貼板,以避免不必要的轉換:

DataFlavor dfHTML = new DataFlavor("text/html; charset=Unicode"); 
boolean hasTransferableHTMLText = (contents != null) && contents.isDataFlavorSupported(dfHTML); 
if (hasTransferableHTMLText) 
{ 
    InputStream is = (InputStream)contents.getTransferData(dfHTML); 
    String htmldata = org.apache.commons.io.IOUtils.toString(is, "Unicode"); 

    Document doc = Jsoup.parse(htmldata); 
    System.out.println(doc.html()); 
    //... 
} 

測試與複製到剪貼板Chrome和FF。兩者都保留您期望的標籤<sub>和<sup>。

EDIT2:

IOUtils指org.apache.commons.io。IOUtils

+0

編輯我的答案.. –

+1

此評論仍然沒有回答。這個rtfToHtml函數來自哪裏?沒有'sup'和'sub'標籤。這不是JSoup問題,而只是該方法的問題(或者源數據不包含您期望的內容)。該方法似乎生成具有較小文本大小的下標作爲「樣式」。沒有機會解析這個語義上的,只有啓發式。 –

+0

問題已解決:) –

-1

Jsoup使用選擇,從而獲得所需的值。 This鏈接將幫助你。

Document doc = Jsoup.Connect("some url); 
Elements sub= doc.select("sub"); 
+0

解析的html中沒有'sub'元素。所以'Elements sub = doc.select(「sub」);'將會是null。 –