0

我在使用JavaHTMLEditorKitHTMLDocument使用 Java 时(仍然)有问题。我只能设置元素的内部 HTML,但我无法获取它。有什么方法可以获取元素的基本 HTML 代码吗?

我的问题是,HTML 支持很差而且写得不好。API 不允许使用基本的和预期的功能。我colspan需要更改attribute. <td>Java 开发人员已经关闭了直截了当的方法:元素的属性集是不可变的。解决方法可能是获取元素的代码(例如<td colspan="2">Hi <u>world</u></td>)并将其替换为新内容(例如<td colspan="3">Hi <u>world</u></td>)。这条路似乎也关闭了。(奖金问题:有什么HTMLEditorKit好处?)

4

2 回答 2

2

您可以获取选定的 Element html。使用套件的 write() 方法传递元素的偏移量。但它将包含在周围的标签“<html>”“<body>”等中。

于 2011-10-03T14:00:11.983 回答
0

谢谢你的提示,斯坦尼斯拉夫。这就是我的解决方案:

/**
 * The method gets inner HTML of given element. If the element is named <code>p-implied</code>
 * or <code>content</code>, it returns null.
 * @param e element
 * @param d document containing given element
 * @return the inner HTML of a HTML tag or null, if e is not a valid HTML tag
 * @throws IOException
 * @throws BadLocationException
 */
public String getInnerHtmlOfTag(Element e, Document d) throws IOException, BadLocationException {
    if (e.getName().equals("p-implied") || e.getName().equals("content"))
        return null;

    CharArrayWriter caw = new CharArrayWriter();
    int i;
    final String startTag = "<" + e.getName();
    final String endTag = "</" + e.getName() + ">";
    final int startTagLength = startTag.length();
    final int endTagLength = endTag.length();

    write(caw, d, e.getStartOffset(), e.getEndOffset() - e.getStartOffset());
    //we have the element but wrapped as full standalone HTML code beginning with HTML start tag
    //thus we need unpack our element
    StringBuffer str = new StringBuffer(caw.toString());
    while (str.length() >= startTagLength) {
        if (str.charAt(0) != '<')
            str.deleteCharAt(0);
        else if (!str.substring(0, startTagLength).equals(startTag))
            str.delete(0, startTagLength);
        else
            break;
    }
    //we've found the beginning of the tag
    for (i = 0; i < str.length(); i++) { //skip it...
        if (str.charAt(i) == '>')
            break; //we've found end position of our start tag
    }
    str.delete(0, i + 1); //...and eat it
    //skip the content
    for (i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '<' && i + endTagLength < str.length() && str.substring(i, i + endTagLength).equals(endTag))
            break; //we've found the end position of inner HTML of our tag
    }
    str.delete(i, str.length()); //now just remove all from i position to the end

    return str.toString().trim();
}

可以轻松修改此方法以获取外部 HTML(因此包含整个标记的代码)。

于 2011-10-04T12:50:58.907 回答