在使用Node.js的过程中,我一般使用json文件来存储配置信息,或静态文件信息存储等。因为使用
json文件在js中真的很方便:“读取文件内容并转换为json数据后直接进行"."操作即可获取或是修改
信息了”。
最近由于需要在前辈的Web应用中添加新功能,需要对XML文件进行操作,下面一起来学习一下吧:
我们使用node的扩展模块xml2js来解析xml文件:
1.安装:在工程目录下使用npm安装:npm install xml2js
之后node_modules目录下会新增两个扩展:
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中添加。