2009-12-19 1 views
2

Как я могу изменить содержимое HTML-тега в Java? Например:Как изменить содержимое HTML-тегов на Java?

до:

<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()); 

Вы можете сохранить d потом в файл.

+0

мне нужно больше разъяснений e.get Первый ребенок(); возвращает Node, тогда как вы можете объявить как элемент «Элемент text = e.getFirstChild();» ... прошу пояснить меня @Dmitry ... спасибо –

+0

setNodeValue и getNodeValue определены в узле. Спасибо за привлечение внимания к типу возврата , – Dmitry

+0

Но вы не определили метод 'process (..)'. –

0

Есть куча парсеров Java с открытым исходным кодом, перечисленных here.

Я не уверен, что наиболее часто используется, но this one (просто называется парсер HTML), вероятно, сделает то, что вы хотите. Он имеет функции для изменения вашего дерева и записи его обратно.

5

Если вы не абсолютно уверены в том, что HTML будет действовать и хорошо сформированы, я настоятельно рекомендую использовать HTML-парсер, что-то вроде TagSoup, Jericho, NekoHTML, HTML 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>