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

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)