2009-12-19 63 views
2

如何更改Java中的HTML標籤內容?例如:如何更改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文本」;當我使用setTextContet("someAnotherText"+{bodyNode}.getTextContent()),並對這些結構進行序列化時,結果爲<body>someAnotherText sometext text</body>,而沒有<div>標籤。這對我來說是個問題。

回答

3

假設您的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()); 

您可以ð之後保存到一個文件。

+0

我e.get需要更多的澄清第一個孩子();返回節點,那麼你怎麼聲明元素「Element text = e.getFirstChild();」...請澄清我@Dmitry ...謝謝 – 2016-06-22 12:39:24

+0

setNodeValue和getNodeValue在Node.Thanks中定義,用於引起注意返回類型。 – Dmitry 2016-06-23 13:21:18

+0

但你沒有定義'process(..)'方法。 – 2018-03-08 02:08:49

0

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

我不確定什麼是最常用的,但this one(只是稱爲HTML解析器)可能會做你想做的。它具有修改您的樹並將其寫回的功能。

5

除非你是絕對肯定的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()); 

這只是一個實現這種方式,非常直截了當。

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>