node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件

2024-02-09 16:52

本文主要是介绍node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请参阅:java : pdfbox 读取 PDF文件内书签

请注意:书的目录.txt 编码:UTF-8,推荐用 Notepad++ 转换编码。

npm install elementtree ;

npm install xml2js ;

node.js 用 elementtree读目录.txt文件,用 xml2js 转换为json数据,ejs 生成 jstree模板所需的文件。

编写 txt_etree_json.js  如下

// 读目录.txt文件,用xml2js 转换为json数据,生成jstree所需的文件
let fs = require('fs');
let process = require('process');
let path = require('path');
let readline = require('readline');
let et = require('elementtree');
let XML = et.XML;
let ElementTree = et.ElementTree;
//  element = et.Element;
let subElement = et.SubElement;
let xml2js = require('xml2js');
let ejs = require('ejs');if (process.argv.length <3){console.error("usage: node txt_etree_json.js file1.txt");return 1;
}
let file1 = process.argv[2];
if (! fs.statSync(file1).isFile()) {console.error("it is not File.");return 2;
}
let ext = path.extname(file1);
if (ext.toLowerCase() != '.txt'){console.error(ext +" is not .txt");return 3;
}let file2 = file1.replace('.txt', '.htm');
console.log(file2);
let fRead = fs.createReadStream(file1);
let fWrite = fs.createWriteStream(file2);
// 创建readline接口实例
let rline = readline.createInterface({input: fRead,
//  output: fWrite,terminal: true
});// 用缩排表现层级关系,假设最多5个层级
const indent1 ="  ";
const indent2 ="    ";
const indent3 ="      ";
const indent4 ="        ";var txt, title, root, edge, p_node, node1, node2, node3, node4, node5;
// line 事件
let ln =1;
rline.on('line', function(line){txt = line.trim();if (ln ==1){// 读取第一行:书名title = txt;// 创建主题节点root = et.Element("node");root.set('id', '1');root.set('text', txt);// 定义状态:state = subElement(root, "state")state.set("opened", 'true')state.set("disabled", 'true')}txt = txt.slice(0,-3); // 去掉行尾的页数if (txt.length ==0 || ln==1) ;else if (txt.length >0 && line.slice(0,1) !=' '){// 创建主题的子节点(1级节点)node1 = subElement(root, "children");node1.set('id', String(ln));node1.set('text', txt);p_node = node1; // 寄存父节点}else if (line.startsWith(indent1) && line.slice(2,3) !=' '){// 创建node1的子节点(2级节点)if (node1) node2 = subElement(node1, "children");else node2 = subElement(root, "children");node2.set('id', String(ln));node2.set('text', txt);p_node = node2;}else if (line.startsWith(indent2) && line.slice(4,5) !=' '){    // 创建node2的子节点(3级节点)if (node2) node3 = subElement(node2, "children");else if(node1) node3 = subElement(node1, "children");else node3 = subElement(root, "children");node3.set('id', String(ln));node3.set('text', txt);p_node = node3;}else if (line.startsWith(indent3) && line.slice(6,7) !=' '){// 创建node3的子节点(4级节点)if (node3) node4 = subElement(node3, "children");else if (node2) node4 = subElement(node2, "children");else if (node1) node4 = subElement(node1, "children");else node4 = subElement(root, "children");node4.set('id', String(ln));node4.set('text', txt);p_node = node4;}else if (line.startsWith(indent4) && line.slice(8,9) !=' '){// 创建node4的子节点(5级节点)if (node4) node5 = subElement(node4, "children");else if (p_node) node5 = subElement(p_node, "children");else node5 = subElement(root, "children");node5.set('id', String(ln));node5.set('text', txt);}else {console.log(txt);}ln++;
});
// 官网 www.npmjs.com/package/xml2js 查找 Options
//  Parser 用于解析xml为json对象 
let parser = new xml2js.Parser({explicitArray:false, mergeAttrs:true});
var etree, xml, json_str;
let filename ="jstree_template.htm";
rline.on('close', function(){etree = new ElementTree(root);xml = etree.write({'xml_declaration': false});parser.parseString(xml, function(err,res){if (err) throw err;//console.dir(res);json_str = '['+ JSON.stringify(res['node'], null,2) +']';});// 官网 ejs.bootcss.com/#docs  <%- 输出非转义的数据到模板 %>//ejs.renderFile(filename, data, options, function(err, str){ejs.renderFile(filename, {title:title, mydir:json_str}, {}, function(err, str){// str => 输出渲染后的 HTML 字符串fWrite.write(str);});    console.log("line number: "+ln);
});

编写 jstree_template.htm  如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title><%= title%></title><script src="../js/jquery-3.2.1.min.js"></script><link rel="stylesheet" href="../js/jstree/dist/themes/default/style.css" /><script src="../js/jstree/dist/jstree.min.js"></script>
</head>
<body><!-- 搜索框 --><div class="search_input"><input type="text" id="search_a" /><img src="../js/jstree/dist/search.png" /></div><div id="treeview1" class="treeview"></div>
<script type="text/javascript">var mydir = <%- mydir%>;$("#treeview1").jstree({'core' : {"multiple" : false,'data' : mydir,'dblclick_toggle': true},"plugins" : ["search"]});//输入框输入时自动搜索var tout = false;$('#search_a').keyup(function(){if (tout) clearTimeout(tout);    tout = setTimeout(function(){$('#treeview1').jstree(true).search($('#search_a').val());   }, 250);});   
</script> 
</body>
</html>

运行 node txt_etree_json.js your_pdf_dir.txt

生成 your_pdf_dir.htm

这篇关于node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694791

相关文章

Mysql数据库中数据的操作CRUD详解

《Mysql数据库中数据的操作CRUD详解》:本文主要介绍Mysql数据库中数据的操作(CRUD),详细描述对Mysql数据库中数据的操作(CRUD),包括插入、修改、删除数据,还有查询数据,包括... 目录一、插入数据(insert)1.插入数据的语法2.注意事项二、修改数据(update)1.语法2.有

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

Spring Validation中9个数据校验工具使用指南

《SpringValidation中9个数据校验工具使用指南》SpringValidation作为Spring生态系统的重要组成部分,提供了一套强大而灵活的数据校验机制,本文给大家介绍了Spring... 目录1. Bean Validation基础注解常用注解示例在控制器中应用2. 自定义约束验证器定义自

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no