2013-12-20 78 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。 –