Jsoup为下标和上标解析html
我使用Jsoup
来将剪贴板值解析为html代码,但它不适用于subscript
和superscript
。举一个例子: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处理Superscript
和Subscript
。任何意见或引用高度赞赏。
编辑
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;
}
您的问题与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
编辑我的答案.. –
此评论仍然没有回答。这个rtfToHtml函数来自哪里?没有'sup'和'sub'标签。这不是JSoup问题,而只是该方法的问题(或者源数据不包含您期望的内容)。该方法似乎生成具有较小文本大小的下标作为“样式”。没有机会解析这个语义上的,只有启发式。 –
问题已解决:) –
Jsoup使用选择,从而获得所需的值。 This链接将帮助你。
Document doc = Jsoup.Connect("some url);
Elements sub= doc.select("sub");
解析的html中没有'sub'元素。所以'Elements sub = doc.select(“sub”);'将会是null。 –
当前的问题没有包含足够的细节。 什么是'rtfToHtml'? Jsoup将所有转换为期望的,但你的问题是在rtfToHtml函数。它是[this](http://www.codeproject.com/Tips/136483/Java-How-to-convert-RTF-into-HTML)? – msangel
@msangel编辑我的问题 –