Я работаю с входящими текстовыми блоками html, например:
String html = "<p>Some text here with already existing tags and it's escaped symbols.\n" +
" More text here:<br/>\\r\\n---<br/>\\r\\n" +
" <img src=\"/attachments/a0d4789a-1575-4b70-b57f-9e8fe21df46b\" sha256=\"2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c\"></a>" +
" It was img tag with attr to replace above</p>\\r\\n\\r\\n<p>More text here\n" +
" and here.<br/>\\r\\n---</p>";
Мне нужно заменить значение атрибута src
в тегах img
слегка измененным значением атрибута sha256
в том же теге.Я легко могу сделать это с помощью Jsoup:
Document doc = Jsoup.parse(html);
Elements elementsByAttribute = doc.select("img[src]");
elementsByAttribute.forEach(x -> x.attr("src", "/usr/myfolder/" + x.attr("sha256") + ".zip"));
Но есть проблема.Входящий текст уже имеет некоторое форматирование, HTML-теги, экранирование и т. Д., Которые необходимо сохранить.Но Jsoup удаляет теги / добавляет теги / освобождает / экранирует и делает некоторые другие модификации исходного ввода.
Например, System.out.println(doc);
или System.out.println(doc.html());
дает мне следующее:
<html>
<head></head>
<body>
<p>Some text here with already existing tags and it's escaped symbols. More text here:<br>\r\n---<br>\r\n <img src="/usr/myfolder/2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c.zip" sha256="2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c"> It was img tag with attr to replace above</p>\r\n\r\n
<p>More text here and here.<br>\r\n---</p>
</body>
</html>
Мой атрибут src
заменен, но добавлено намного больше html-тегов, it's
экранируется до it's
.
Если я использую System.out.println(doc.text());
, я получаю следующее:
Some text here with already existing tags and it's escaped symbols. More text here: \r\n--- \r\n It was img tag with attr to replace above\r\n\r\n More text here and here. \r\n---
Мои теги здесь удалены, it's
снова переведено в it's
.
Я пробовал некоторые другие функции Jsoup, но не нашел, как решить эту проблему.
Quesion: есть ли способ заменить только некоторые атрибуты Jsoup без изменения других тегов?Может быть, есть какая-то другая библиотека для этой цели?Или мой единственный способ это регулярное выражение?