微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

标准库是 Java 加载/读取和编辑/修改和保存 html 文件而无需重新格式化的最佳选择吗?

如何解决标准库是 Java 加载/读取和编辑/修改和保存 html 文件而无需重新格式化的最佳选择吗?

我想加载/读取和编辑/修改并保存位于我硬盘上的 html 文件。我尝试了 JSOUP,但它一直在重新格式化 html 文件。我想避免重新格式化。

我想在 html 文件中的 <script> 之后和 var deviceReady = false; 之前注入一些 JavaScript。

我需要解析文件吗?

我应该使用认的 Java 吗? (BufferedReader,FileReader,Scanner)

<!DOCTYPE html>
<html lang="en">
<head>
<Meta name='viewport' content='initial-scale = 1,minimum-scale = 1,maximum-scale = 1'/>
<Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<Meta http-equiv="x-ua-compatible" content="IE=10">
<title>LX-XXX-KU</title>
<style type="text/css">#initialLoading{background:url(assets/htmlimages/loader.gif) no-repeat center 
center;background-color:#ffffff;position:absolute;margin:auto;top:0;left:0;right:0;bottom:0;z- 
index:10010;}</style>

"

<script>

var deviceReady = false;
var initCalled = false ;
var initialized = false;

function onBodyLoad()
{
 if(typeof window.device === 'undefined')
{
    document.addEventListener("deviceready",onDeviceReady,false);
}
else
 {
    onDeviceReady();
 }
}

Javasacript 我想在 <script> 之后和 var deviceReady = false; 之前添加

`//adds numbers to TOC
window.addEventListener( 'moduleReadyEvent',function ( e )
{
var myText = document.getElementsByClassName('tocText');

for ( var i = 0; i < myText.length; i++ )
{
var getText = myText[ i ].childNodes;
var str = ( i + 1 ) + ' ' + getText[ 0 ].innerHTML;
getText[ 0 ].innerHTML = str;
}
});`

解决方法

这可以像这样完成:

File f = ...;
String contents = new String(Files.readAllBytes(f));
int idx = contents.indexOf(insertBeforeStr);
contents = contents.substring(0,idx) + contentToBeAdded + contents.substring(idx + 1);

// write contents back to the disk.
,

如果您关闭 jsoup 的 pretty printing 选项,并使用 XML parser 而不是验证 HTML 解析器,则文档及其所有文本(包括空格)将通过几乎不受干扰的其他比对属性、缺少结束标记等的语法修复。

例如,查看您在 Try jsoup 上的输入并使用漂亮打印并使用 XML 解析器,实际上与您的原始输入相同。

代码类似于:

Document doc = Jsoup.parse("<script>\nSomething(); ","",Parser.xmlParser());
doc.outputSettings().prettyPrint(false);

Element scriptEl = doc.selectFirst("script");
DataNode scriptData = scriptEl.dataNodes().get(0);
scriptData.setWholeData(scriptData.getWholeData() + "\nanotherFunction();");

System.out.println(doc.html());

给我们(注意,由于使用了 XML 解析器,没有自动创建 HTML 结构):

<script>
Something(); 
anotherFunction()</script>

ControlAltDel 的答案绝对有效,这意味着您只需使用 Java 基础库即可完成。在这种情况下,使用 jsoup 的好处是(恕我直言 - 作为 jsoup 的作者)是您不会尝试字符串匹配 HTML,并且不会被例如捕获评论中的 <script>,或者在本例中缺少关闭的 </script> 标签等。当然是 YMMV。

顺便说一下,一旦 jsoup 1.14.1 发布(很快!)并更改了 #1419(对于脚本元素,将文本设置代理为数据而不进行转义),代码将简化为:

Element scriptEl = doc.selectFirst("script");
scriptEl.appendText("\nanotherFunction()");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。