NodeJS使⽤xml2js解析xml数据格式
我最近在弄⼀个 docx 的处理⼯具,docx ⽂档的数据储存⽅式其实就是 xml , ⾸先我直接了轮⼦,毕竟 docx ⽂档的 xml 不是给正常⼈看的,现在好像⽐较强的是 xml2js
这个轮⼦使⽤起来还是⽐较舒服的,开头我还是先简单翻译⼀下⽂档
npm 安装
npm install xml2js
简单的使⽤,xml2js 会将 var xml 变量中的 xml 字符串传⼊ xml2js 中导出的 parseString ⽅法中处理,parseString ⽅法接收两个⼀个是待处理的 xml 字符串,还有⼀个是 callback function 也就是回调函数,解析后会执⾏这个⽅法这个⽅法返回两个参数 err 和result,其中 err 是解析失败后的错误对象,result 则是解析成功后返回 xml 对应的 json 对象,不过这个对象不是完美还原 xml 出来的有点⼩瑕疵我们放到后⾯说…
var parseString = require('xml2js').parseString;
var xml = "<root>Hello xml2js!</root>"
parseString(xml, function (err, result) {
console.dir(result);
});
普通的解析就直接使⽤ xml2js.parseString ⽅法就可以了,但是遇到特殊的我们就还需要在 parseString 中传⼊第三个参数,配置对象
var parseString = require('xml2js').parseString;
var xml = "<root>Hello xml2js!</root>"
parseString(xml, {trim: true}, function (err, result) {
console.dir(result);
});
看起来和上⾯的⽅法没有太⼤差别,但是在调⽤的时候多传⼊了⼀个对象⾥⾯ trim: true 的配置,别着急下⾯我会慢慢介绍都有那些
xml2js配置参数的
参数:attrkey ,默认值:$ ,描述:⽤于访问 xml 节点属性的前缀,也就是说 xml 的属性都放在节点下⾯的 $ 对象中,你可以改成你喜欢的,如果你不知道 xml 的属性是啥的话你就别管这个
参数:charkey ,默认值:_ ,描述:⽤于访问字符内容的前缀,也就是说 xml 的内容是字符的话都放在节点下⾯的 _ 对象中,你可以改成你喜欢的前缀,如果你不知道的话就别改
参数:explicitCharkey ,默认值:false
参数:trim ,默认值:false ,描述:在⽂本节点的开头和结尾处修剪空格
参数:normalizeTags ,默认值:false ,描述:将所有标签名称标准化为⼩写
参数:normalize ,默认值:false ,描述:处理掉⽂本节点内的空格
参数:explicitRoot ,默认值:true ,描述:是否获取结果对象中的根节点
参数:emptyTag ,默认值:'' ,描述:空节点默认值
参数:explicitArray ,默认值:true ,描述:如果为true,则始终将⼦节点放⼊数组中;否则,仅当存
在多个数组时才创建⼀个数组。
参数:ignoreAttrs ,默认值:false ,描述:忽略所有 xml 属性,仅创建⽂本节点
参数:mergeAttrs ,默认值:false ,描述:合并属性和⼦元素作为⽗元素的属性,⽽不是从⼦属性对象中键⼊属性。如果 ignoreAttrs 为 true,则忽略此选项
参数:validator ,默认值:null ,描述:您可以根据需要指定⼀个以某种⽅式验证结果结构的可调⽤对象
参数:xmlns ,默认值:false ,描述:给每个元素⼀个通常称为“ $ ns”的字段(第⼀个字符与 attrkey 相同),其中包含其本地名称和名称空间URI
参数:explicitChildren ,默认值:$ ,描述:将⼦元素放在单独的属性中,不适⽤于mergeAttrs = true,如果 element 没有⼦级,则不会创建“⼦级”。在 0.2.5 版本开始⽀持设置
js合并两个数组参数:childkey ,默认值:$$ ,描述:如果 explicitChildren 设置为 true,则⽤于访问⼦元素的前缀。在 0.2.5 版本开始⽀持设置
参数:preserveChildrenOrder ,默认值:false ,描述:修改 explicitChildren 的⾏为,使“children”属
性的值成为有序数组。当这个值为 true 时,每个节点还将获得⼀个#name字段,其值将对应于XML节点名,因此您可以迭代“⼦”数组,仍然能够确定节点名。在这个配置中,命名(可能是⽆序的)属性也保留在与有序的“⼦”数组相同的级别。在 0.4.9 版本开始⽀持设置
参数:charsAsChildren ,默认值:false ,描述:确定如果打开explicitChildren,则是否应将 char 视为⼦级,在 0.2.5 版本开始⽀持设置
参数:includeWhiteChars ,默认值:false ,描述:确定是否应包含仅空⽩⽂本节点。在 0.4.17 版本开始⽀持设置
参数:async ,默认值:false ,描述:回调应该异步吗?如果您的代码依赖于回调的同步执⾏,则这可能是不兼容的更改。未来的
xml2js 版本可能会更改此默认设置,因此建议⽆论如何不要依赖于同步执⾏。在 0.2.6 版本开始⽀持设置
参数:strict ,默认值:true ,描述:将 sax-js 设置为严格或⾮严格解析模式。强烈建议将其默认设置为 true,因为解析格式不正确的XML 的 HTML 可能会产⽣⼏乎所有结果。在 0.2.7 版本开始⽀持设置
参数:attrNameProcessors ,默认值:null ,描述:允许添加属性名称处理功能。在 0.4.14 版本开始
⽀持设置。接受具有以下签名的函数数组:
function (name){
//do something with `name`
return name
}
参数:attrValueProcessors ,默认值:null ,描述:允许添加属性值处理功能。在 0.4.1 版本开始⽀持设置。接受具有以下签名的函数数组:
function (value, name){
//do something with `name`
return name
}
参数:tagNameProcessors ,默认值:null ,描述:允许添加标签名称处理功能。在 0.4.1 版本开始⽀持设置。接受具有以下签名的函数数组:
function (name){
//do something with `name`
return name
}
参数:valueProcessors ,默认值:null ,描述:允许添加元素值处理功能。在 0.4.6 版本开始⽀持设置。接受具有以下签名的函数数组:
function (value, name){
//do something with `name`
return name
}
好了,解析 xml 的相关配置讲完了,我们再看看它怎么把 json 给解析回 xml 的吧
在 xml2js 中有⼀个 Builder 函数,可以直接转换过去…
var xml2js = require('xml2js');
var obj = {root: {$: {id: "my id"}, _: "my inner text"}};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。