Как изменить содержимое HTML-тега в Java? - PullRequest
2 голосов
/ 20 декабря 2009

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

Ответы [ 4 ]

6 голосов
/ 20 декабря 2009

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

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

4 голосов
/ 20 декабря 2009

При условии, что ваш 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 голосов
/ 08 марта 2018

Как правило, у вас есть 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>
0 голосов
/ 20 декабря 2009

В списке есть несколько HTML-парсеров с открытым исходным кодом здесь .

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

...