有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJSOUP解析html的下标和上标

我正在使用Jsoup将剪贴板值解析为html代码,但它不适用于subscriptsuperscript。例如:

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

下标
你好World(HTML:<b>Hello <sub>World</sub></b>

代码

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

上述示例的结果为:

< 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;
    }

共 (2) 个答案

  1. # 1 楼答案

    您的问题与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指的是组织。阿帕奇。平民伊奥。IOUtils

  2. # 2 楼答案

    使用Jsoup的选择器获取所需的值Thislink将帮助您

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