使用Node.js的xml2js模块操作xml数据


在使用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中添加。
优质内容筛选与推荐>>
1、js 模拟百度关键字搜索与跳转
2、40. Combination Sum II
3、淡入淡出,弹入弹出动画代码
4、webstorm alt + F2
5、Vue 从零开始--搭建环境


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn