Как изменить содержимое 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>