【问题标题】:How to change HTML tag content in Java?如何在 Java 中更改 HTML 标签内容?
【发布时间】:2009-12-19 21:56:31
【问题描述】:

如何在 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()),并序列化这些结构时,结果是&lt;body&gt;someAnotherText sometext text&lt;/body&gt;,没有&lt;div&gt;标签。这对我来说是个问题。

【问题讨论】:

    标签: java html tags jtidy


    【解决方案1】:

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

    比如用HTML Parser(因为实现很简单),用visitor,提供自己的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());
    

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

    【讨论】:

      【解决方案2】:

      如果您的 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 保存到文件中。

      【讨论】:

      • 我需要更多说明 e.getFirstChild();返回节点,那么如何声明为元素“元素文本 = e.getFirstChild();”...请澄清我@Dmitry...谢谢
      • setNodeValue 和 getNodeValue 在 Node 中定义。感谢您关注返回类型。
      • 但是你没有定义process(..)方法。
      【解决方案3】:

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

      我不确定最常用的是什么,但this one(称为 HTML 解析器)可能会满足您的需求。它具有修改树并将其写回的功能。

      【讨论】:

        【解决方案4】:

        一般来说,您有一个要从中提取数据的 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>
        

        【讨论】:

        • 您好 Menai,我有一个带有链接的 html 页面。它有带有标签 rel="noopener noreferrer" 的 url。这些网址不会在 onClick 事件中打开。能说说怎么解决这个问题吗?
        猜你喜欢
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多