xmldoc库
网上常见的方法都是将xml文件转换成json,进而完成xml的解析,见https://blog.csdn.net/slient_love/article/details/114328946。
但是对于层次深且结构复杂的xml文件,应该采用xmldoc库.
安装方法:
npm install xmldoc
使用方法:
var xmldoc = require('xmldoc');
var document = new xmldoc.XmlDocument(xmlData.toString());
通过document访问子节点。每个节点都是一个XmlElement
对象
XmlElement
对象的一些常用的属性
name - 节点的名称
attr - 节点的属性
val - 节点的内容
children - XmlElement数组,子节点
XmlElement
对象的一些常用的函数
eachChild(func)遍历子节点,func为匿名函数,传入的实参为“当前子节点”
使用案例
已知一个用于描述文件系统(文件树)的xml. 使用Nodejs通过递归的方式将该文件转换为可被bootstrap-treeview识别的json文件。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<dir name="top">
<dir name="dir 1">
<file name="file 1.1"></file>
<file name="file 1.2"></file>
</dir>
<dir name="dir 2">
<dir name="dir 2.1">
<file name="file 2.1.1"></file>
<file name="file 2.1.2"></file>
</dir>
</dir>
<file name="file 0.1"></file>
<file name="file 0.2"></file>
</dir>
读写文件分别用到了fs
库和jsonFile
库,代码如下
//sourcePath是xml文件的路径,targetPath是输出json文件的路径
fs.readFile(sourcePath, function (err, xmlData) {//读取文件
if (err) {
console.log(err)
return null
}
var xmldoc = require('xmldoc');//使用xmldoc库
var document = new xmldoc.XmlDocument(xmlData.toString());
var dataTree = []
recursion(document, "", dataTree)//以递归的方式解析xml文件
//输出json文件,也就是dataTree这个数组
jsonFile.writeFile(targetPath, dataTree, function (err) { if (err) console.log(err) });
})
其中的递归函数如下:
function recursion(node, tab, dataTree) {
if (node.children.length == 0)//no children
{
return
}
node.eachChild(function (child) {
console.log(tab + child.attr.name)
if (child.children.length == 0) {
var temp = new Object({ text: child.attr.name })
}
else {
var temp = new Object({ text: child.attr.name, nodes: [] })
recursion(child, tab + "----", temp.nodes)
}
dataTree.push(temp)
})
}
运行之后,控制台输出如下:
dir 1
----file 1.1
----file 1.2
dir 2
----dir 2.1
--------file 2.1.1
--------file 2.1.2
file 0.1
file 0.2
得到的json文件如下:
[
{
"text": "Node 1",
"nodes": [
{
"text": "Child 1",
"nodes": [
{
"text": "Grandchild 1"
},
{
"text": "Grandchild 2"
}
]
},
{
"text": "Child 2"
}
]
},
{
"text": "Parent 2",
"nodes": [
{
"text": "Child 2",
"nodes": [
{
"text": "Grandchild 3"
},
{
"text": "Grandchild 4"
}
]
},
{
"text": "Child 2"
}
]
},
{
"text": "Parent 3"
},
{
"text": "Parent 4"
},
{
"text": "Parent 5"
}
]
这个json文件清晰地描述了文件系统的结构(文件树)。将json文件作为bootstrap-treeview的数据源,进而获得美观的树状图。bootstrap-treeview的使用方法不在本文讨论范围内。