Как изменить содержимое 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() это дает мне: "некоторый текстовый текст"; когда я использую setTextContet("someAnotherText"+{bodyNode}.getTextContent())и сериализовать эти структуры, результат <body>someAnotherText sometext text</body>без <div> теги. Это проблема для меня.

4 ответа

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

Это всего лишь один из способов реализовать это, довольно просто.

При условии, что ваш 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 впоследствии в файл.

Здесь есть несколько парсеров Java HTML с открытым исходным кодом.

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

Как правило, у вас есть 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>
Другие вопросы по тегам