2

如何更改 Java 中标签的 HTML 内容?例如:

前:

<html>
    <head>
    </head>
    <body>
        <div>text<div>**text**</div>text</div>
    </body>
</html>

后:

<html>
    <head>
    </head>
    <body>
        <div>text<div>**new text**</div>text</div>
    </body>
</html>

我试过 JTidy,但它不支持getTextContent. 还有其他解决方案吗?


谢谢,我不想解析格式良好的 HTML。我试过 TagSoup,但是当我有这个代码时:

<body>
sometext <div>text</div>
</body>

我想将“sometext”更改为“someAnotherText”,当我使用{bodyNode}.getTextContent()它时给我:“sometext text”;当我使用setTextContet("someAnotherText"+{bodyNode}.getTextContent())并序列化这些结构时,结果是<body>someAnotherText sometext text</body>,没有<div>标签。这对我来说是个问题。

4

4 回答 4

6

除非您绝对确定 HTML 有效且格式正确,否则我强烈建议您使用 HTML 解析器,例如TagSoupJerichoNekoHTMLHTML Parser等,前两者对于解析任何类型的文件都特别强大废话:)

例如,使用HTML Parser(因为实现非常简单),使用访问者,提供您自己的NodeVisitor

public class MyNodeVisitor extends NodeVisitor {
    public MyNodeVisitor() {
    }

    public void visitStringNode (Text string)
    {
        if (string.getText().equals("**text**")) {
            string.setText("**new text**");
        }
    }
}

然后,创建一个Parser,解析 HTML 字符串并访问返回的节点列表:

Parser parser = new Parser(htmlString);
NodeList nl = parser.parse(null);
nl.visitAllNodesWith(new MyNodeVisitor());
System.out.println(nl.toHtml());

这只是实现这一点的一种方法,非常简单。

于 2009-12-19T22:50:35.540 回答
4

如果您的 HTML 是格式良好的 XML(如果不是,那么您可以使用 JTidy 来整理它),您可以使用 DOM 或 SAX 解析器对其进行解析。如果您的文档不大,DOM 可能更容易。

如果您的文本是具有 id="id" 的节点的唯一子节点,则类似这样的方法可以解决问题:

Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
Element e = d.getElementById("id");
Node text = e.getFirstChild();
text.setNodeValue(process(text.getNodeValue());

之后您可以将 d 保存到文件中。

于 2009-12-19T22:02:13.813 回答
0

这里列出了一堆开源 Java HTML 解析器。

我不确定什么是最常用的,但这个(只是称为 HTML 解析器)可能会做你想要的。它具有修改树并将其写回的功能。

于 2009-12-19T22:10:29.810 回答
0

通常,您有一个要从中提取数据的 HTML 文档。您大致了解 HTML 文档的结构。

有几个解析器库,但最好的一个是Jsoup,您可以使用 DOM 方法来导航文档和更新值。在您的情况下,您需要读取文件并使用属性设置器方法。

示例 XHTML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Example</title>
    </head>
    <body>
        <p id="content">Hello World</p>

    </body>
</html>

Java代码:

     File input = new File("D:\\Projects\\Odata Project\\Odata\\src\\web\\html\\inscription_template.xhtml");
            org.jsoup.nodes.Document doc = Jsoup.parse(input,null);
            org.jsoup.nodes.Element content = doc.getElementById("content");
            System.out.println(content.text("Hi How are you ?"));
            System.out.println(content.text());
            System.out.println(doc);

执行后输出:

<p id="content">Hi How are you ?</p>
Hi How are you ?
<!--?xml version="1.0" encoding="UTF-8"?-->
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
--><!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> 
  <title>Example</title> 
 </head> 
 <body> 
  <p id="content">Hi How are you ?</p>   
 </body>
</html>
于 2018-03-08T03:08:21.830 回答