在使用Node.js的过程当中,我通常使用json文件来存储配置信息,或静态文件信息存储等。由于使用node
json文件在js中真的很方便:“读取文件内容并转换为json数据后直接进行"."操做便可获取或是修改npm
信息了”。json
最近因为须要在前辈的Web应用中添加新功能,须要对XML文件进行操做,下面一块儿来学习一下吧:数组
咱们使用node的扩展模块xml2js来解析xml文件:app
1.安装:在工程目录下使用npm安装:npm install xml2js异步
以后node_modules目录下会新增两个扩展:async
xml2js是用于解析xml文件的扩展,使用后能够将xml格式数据转为json格式函数
xmlbuilder适用于将json格式数据转换为xml格式的扩展单元测试
2.安装完成后的使用:学习
在app.js中导入:
const xml2js = require('xml2js');
导入后建立解析器xmlParser,Parser方法中含有options参数,可用于一些自定义的设置,下面会有部分介绍:
//xml解析器 var xmlParser = new xml2js.Parser();
读取xml文件:
//读取xml文件
var data = fs.readFileSync(filePath);
使用xml解析器获取xml文件数据,使用建立解析器的parseString方法,第一个参数是fs.readFileSync读取的数据,
第二个参数是一个回调函数,包含两个参数,一是错误处理err,二是返回的解析结果result:
xmlParser.parseString(data,function(err,result){ var strings = result.resources.string picPreview.textInfo.nameCn = strings[0]._; });
个人xml文档结构以下:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">gfsd</string> <string name="app_name_private">Cloud</string> <string name="app_type">Enterprise Cloud</string> <string name="login_mail">Email/Mobile</string> </resources>
获取的解析结果打印以下:
result:[object Object]
result = { resources:{ string:[ { _:gfsd, $:{ name:app_name } },{ _:Cloud, $:{ name:app_name_private }, ............依次类推 } ] } }
由上能够看出解析的结果,数据的获取如今就是操做json了,但咱们看到,xml数据中的string节点
被解析成了一个数组,这是由于xml2js默认会把子子节点的值变为一个数组,怎么解决这一问题呢?
很简单,只要在建立xml解析器时设置options中的explicitArray参数为false便可:
var xmlParser = new xml2js.Parser({expzhe'llicitArray : false, ignoreAttrs : true})
摘自npm中的解释,解析器的更多参数含义(只包含部分且使用Google翻译,详尽解释请访问这里):
attrkey
(默认值$
:):用于访问属性的前缀。版本0.1默认为@
。charkey
(默认值_
:):用于访问角色内容的前缀。版本0.1默认为#
。explicitCharkey
(默认值:false
)trim
(默认值false
:):修剪文本节点开头和结尾的空格。normalizeTags
(默认值false
:):将全部标记名称标准化为小写。normalize
(默认值false
:):修剪文本节点内的空格。explicitRoot
(默认值:):true
若是要在结果对象中获取根节点,请设置此项。emptyTag
(默认值:):''
空节点的值是多少。explicitArray
(默认值:):true
若是为true,则始终将子节点放在数组中; 不然只有在有多个数组时才会建立数组。ignoreAttrs
(默认值false
:):忽略全部XML属性,仅建立文本节点。mergeAttrs
(默认值false
:):将属性和子元素合并为父元素的属性,而不是将子属性对象的属性键入。若是ignoreAttrs
是,则忽略此选项false
。validator
(默认值null
):您能够指定一个callable,以某种方式验证生成的结构,不管如何。有关示例,请参阅单元测试。xmlns
(默认false
):为每一个元素提供一个一般称为“$ ns”的字段(第一个字符与attrkey相同),该字段包含其本地名称和名称空间URI。explicitChildren
(默认值false
):将子元素放在单独的属性中。不适用mergeAttrs = true
。若是元素没有子元素,则不会建立“children”。在0.2.5中添加。childkey
(默认值$$
):若是explicitChildren
设置为,则用于访问子元素的前缀true
。在0.2.5中添加。preserveChildrenOrder
(默认值false
):修改行为, explicitChildren
以使“children”属性的值成为有序数组。若是是这样true
,每一个节点也将得到一个#name
字段,其值将对应于XML nodeName,以便您能够迭代“children”数组并仍然可以肯定节点名称。命名(和可能无序)属性也在此配置中保留在与有序“children”数组相同的级别。在0.4.9中添加。charsAsChildren
(默认值false
):肯定若是explicitChildren
打开,是否应将字符视为子项。在0.2.5中添加。includeWhiteChars
(默认值false
):肯定是否应包含仅限空白的文本节点。在0.4.17中添加。async
(默认值false
):回调应该是异步的吗?若是您的代码依赖于回调的同步执行,则这可能是不兼容的更改。将来版本xml2js
可能会更改此默认值,所以建议不依赖于同步执行。在0.2.6中添加。strict
(默认值true
):将sax-js设置为严格或非严格解析模式。默认为true
这是强烈推荐,由于解析这是不正确的XML可能产生几乎任何HTML。在0.2.7中添加。