共计 4235 个字符,预计需要花费 11 分钟才能阅读完成。
解析 XML 文件是开发中常见的需要之一。为了以一种简略易用的形式拜访 XML 数据,你可能不想编译一个 C 解析器,而是想寻找一个更不便的解决方案。那么,xml2js 就是你须要的工具!xml2js 是一个简略的 XML 到 JavaScript 对象转换器,反对双向转换。它应用了 sax-js 和 xmlbuilder-js 这两个工具库。
装置
最简略的装置 xml2js 的形式是应用 npm。只需执行npm install xml2js
,npm 将会下载 xml2js 及其所有依赖。xml2js 也能够通过 Bower 进行装置,只需执行bower install xml2js
,Bower 将会下载 xml2js 及其所有依赖。
用法
因为你是一位十分聪慧的开发者,所以不须要过多的教程领导。解析 XML 应该是一件简略的事件,咱们间接通过一些示例进行学习。
简短用法
你心愿尽可能简略、轻松地解析 XML 吗?应用以下代码:
var parseString = require('xml2js').parseString; | |
var xml = "<root>Hello xml2js!</root>" | |
parseString(xml, function (err, result) {console.dir(result); | |
}); |
这真是再简略不过了,对吧?这个办法实用于 xml2js 的 0.2.3 版本及以上。应用 CoffeeScript 时,代码如下:
CoffeeScript 可能比拟小众,然而官网文档有举例了相干内容,故本文进行保留。
{parseString} = require 'xml2js' | |
xml = "<root>Hello xml2js!</root>" | |
parseString xml, (err, result) -> | |
console.dir result |
如果你须要一些非凡的选项,也不必放心,xml2js 反对许多选项(见下文),你能够将这些选项作为第二个参数进行指定:
parseString(xml, {trim: true}, function (err, result) {});
实例办法
如果你之前始终应用 xml-simple 或者本人封装的办法来解决 XML,那么从 0.1.11 版本开始,xml2js 为你增加了以下办法:
var fs = require('fs'), | |
xml2js = require('xml2js'); | |
var parser = new xml2js.Parser(); | |
fs.readFile(__dirname + '/foo.xml', function(err, data) {parser.parseString(data, function (err, result) {console.dir(result); | |
console.log('Done'); | |
}); | |
}); |
看吧,没有事件监听器!
你还能够应用 CoffeeScript 来进一步缩小代码的冗余:
fs = require 'fs', | |
xml2js = require 'xml2js' | |
parser = new xml2js.Parser() | |
fs.readFile __dirname + '/foo.xml', (err, data) -> | |
parser.parseString data, (err, result) -> | |
console.dir result | |
console.log 'Done.' |
然而,如果你遗记应用 new
关键字创立一个新的 Parser
对象会怎么样?从 0.2.8 开始,你也能够不应用这个关键字。从 0.2.8 开始,你能够不应用它,在这种状况下,xml2js 会帮忙你增加它,以保障不会再出现意外和莫名其妙的 bug!
Promise 用法
var xml2js = require('xml2js'); | |
var xml = '<foo></foo>'; | |
// 1. With parser | |
var parser = new xml2js.Parser(/* options */); | |
parser.parseStringPromise(xml).then(function (result) {console.dir(result); | |
console.log('Done'); | |
}) | |
.catch(function (err) {// Failed}); | |
// 2. Without parser | |
xml2js.parseStringPromise(xml /*, options */).then(function (result) {console.dir(result); | |
console.log('Done'); | |
}) | |
.catch(function (err) {// Failed}); |
- 应用解析器进行解析:通过创立 xml2js 解析器的实例,调用解析器的
parseStringPromise
办法对 XML 数据进行解析,并通过.then()
办法解决解析胜利的后果,通过.catch()
办法解决解析过程中的谬误。 - 不应用解析器间接解析:间接调用 xml2js 库的
parseStringPromise
办法对 XML 数据进行解析,通过.then()
办法解决解析胜利的后果,通过.catch()
办法解决解析过程中的谬误。这种办法省去了创立解析器实例的步骤,间接调用库函数进行解析。
应用 XML 构建器
自 0.4.0 版本起,xml2js 还反对应用对象来构建 XML。上面是一个示例:
const xml2js = require('xml2js'); | |
const obj = {name: "Super", Surname: "Man", age: 23}; | |
const builder = new xml2js.Builder(); | |
const xml = builder.buildObject(obj); |
上述代码将生成如下的 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |
<root> | |
<name>Super</name> | |
<Surname>Man</Surname> | |
<age>23</age> | |
</root> |
通过设置 cdata
选项为 true
,能够反对写入 CDATA。
指定属性
应用 xml2js,你能够指定 XML 元素的属性。上面是一个示例:
const xml2js = require('xml2js'); | |
const obj = {root: {$: {id: "my id"}, _: "my inner text"}}; | |
const builder = new xml2js.Builder(); | |
const xml = builder.buildObject(obj); |
上述代码将生成如下的 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |
<root id="my id">my inner text</root> |
增加 xmlns 属性
xml2js 还反对在生成的 XML 中增加 XML 命名空间前缀和 URI 对,通过应用 xmlns
属性。
在根元素上申明默认命名空间的示例:
const obj = { | |
Foo: { | |
$: {"xmlns": "http://foo.com"} | |
} | |
}; |
通过调用 buildObject(obj)
办法,将生成以下 XML:
<Foo xmlns="http://foo.com"/>
在非根元素上申明非默认命名空间的示例:
const obj = { | |
'foo:Foo': { | |
$: {'xmlns:foo': 'http://foo.com'}, | |
'bar:Bar': { | |
$: {'xmlns:bar': 'http://bar.com'} | |
} | |
} | |
}; |
通过调用 buildObject(obj)
办法,将生成以下 XML:
<foo:Foo xmlns:foo="http://foo.com"> | |
<bar:Bar xmlns:bar="http://bar.com"/> | |
</foo:Foo> |
解决属性、标签名和值
自 0.4.1 版本起,你能够抉择提供解析器的属性名和标签名处理器,以及元素值处理器(自 0.4.14 版本起,还能够提供属性值处理器)。
上面是一个示例,演示如何将属性名和标签名转换为大写:
function nameToUpperCase(name) {return name.toUpperCase(); | |
} | |
// 将所有属性和标签名及其值转换为大写 | |
parseString(xml, {tagNameProcessors: [nameToUpperCase], | |
attrNameProcessors: [nameToUpperCase], | |
valueProcessors: [nameToUpperCase], | |
attrValueProcessors: [nameToUpperCase] | |
}, function (err, result) {// 解决后的数据}); |
tagNameProcessors
和 attrNameProcessors
选项承受一个函数数组,函数的签名如下:
function (name) { | |
// 对 `name` 做一些解决 | |
return name; | |
} |
attrValueProcessors
和 valueProcessors
选项承受一个函数数组,函数的签名如下:
function (value, name) { | |
// `name` 将是节点名或属性名 | |
// 对 `value` 做一些解决,能够依据节点或属性名自定义解决形式 | |
return value; | |
} |
xml2js 提供了一些内置的处理器,能够在 lib/processors.js
文件中找到:
normalize
:将名称转换为小写(当options.normalize
设置为true
时主动应用)firstCharLowerCase
:将首字母转换为小写。例如,’MyTagName’ 变为 ‘myTagName’stripPrefix
:去除 XML 命名空间前缀。例如,<foo:Bar/>
将变为 ‘Bar’(留神:xmlns 前缀不会被去除)parseNumbers
:将相似整数的字符串解析为整数,将相似浮点数的字符串解析为浮点数。例如,”0″ 变为 0,”15.56″ 变为 15.56parseBooleans
:将相似布尔值的字符串解析为布尔值。例如,”true” 变为 true,”false” 变为 false
xml2js 提供了弱小的性能,使得在 Node.js 应用程序中解析和构建 XML 变得简略而灵便。无论你是须要解析简单的 XML 文档,还是须要构建自定义的 XML 输入,xml2js 都是一个值得尝试的工具。
参考文档:Leonidas-from-XIV/node-xml2js: XML to JavaScript object converter.