nml-ex
v1.0.0
Published
JSON <=> XML
Downloads
123
Readme
nml-ex
nml-ex是在NML基础上进行的扩充,NML 是 JSON 的扩展,用于实现 JSON 与 XML 之间的双向转换。它基于
JSON 语法(Standard ECMA-262 3rd Edition - December 1999),
通过 Value 类型为 JSON 节点附加 XML 属性。
语法定义
nml
{ member }
object
{}
{ member (, member)* }
member
string : value
value
string | number | boolean | null | object | array | Value
array
[]
[ element (, element)* ]
element
value
Value(v, attrs)
{ "attrs" : attributes, "value" : v }
attributes
{}
{ pair (, pair)* }
pair
string : string安装
npm install nml-ex使用
const nml = require('nml-ex');
const Value = require('nml-ex/Value');解析 XML → JSON
const xml = '<name sex="0" age="14">May</name>';
const json = nml.parse(xml);
// → { name: Value({ sex: '0', age: '14' }, 'May') }有属性的节点解析为 Value 对象,attrs 存放属性,value 存放文本内容。
无属性的节点直接返回其值,Value 包装会被自动剥离。
序列化 JSON → XML
const obj = { name: new Value({ sex: '0', age: '14' }, 'May') };
nml.stringify(obj);
// → <?xml version="1.0" encoding="UTF-8"?>
// <name sex="0" age="14">May</name>
// 带 XSL 样式表
nml.stringify(obj, 'transform.xsl');数组
同名元素自动合并为数组:
const xml = '<root><item>a</item><item>b</item></root>';
nml.parse(xml);
// → { root: { item: ['a', 'b'] } }
nml.stringify({ root: { item: ['a', 'b'] } });
// → <root><item>a</item><item>b</item></root>[join] — 混合内容
当数组的键名为 [join] 时,子元素直接拼接而不包裹标签,
适用于 XML 混合内容(文本与元素交错):
const obj = {
root: {
'[join]': ['Hello ', new Value({}, { b: 'World' }), '!'],
},
};
nml.stringify(obj);
// → <root>Hello <b>World</b>!</root>[join] 中的 null 和 undefined 会被静默跳过。
null / undefined / 空值
| 值 | XML 输出 |
|----|---------|
| null | <tag/> |
| undefined | <tag/> |
| "" (空字符串) | <tag></tag> |
| 0 / false | <tag>0</tag> / <tag>false</tag> |
注释与 CDATA
解析时自动跳过 XML 注释,提取 CDATA 原文:
const xml = '<?xml version="1.0"?><root><!-- 注释 --><msg><![CDATA[<raw>文本</raw>]]></msg></root>';
nml.parse(xml);
// → { root: { msg: '<raw>文本</raw>' } }CDATA 中的内容不做实体反转义,保留原始文本。
Value API
const Value = require('nml-ex/Value');构造函数
new Value(attrs, value)attrs— 属性对象{ key: 'value', ... }value— 节点值,可以是任意 NML 支持的类型
静态方法
| 方法 | 说明 |
|------|------|
| Value.escape(str) | 转义 XML 特殊字符 & < > " ' |
| Value.unescape(str) | 反转义 XML 实体 |
| Value.isEmpty(o) | 判断对象/值是否为空 |
| Value.stringify(attrs) | 将属性对象序列化为 XML 属性字符串 |
| Value.parse(str) | 从 XML 属性字符串解析为属性对象 |
| Value.compare(o1, o2) | 深度比较两个值是否相等 |
类型说明
XML 文本节点不携带类型信息,解析时所有简单值均返回字符串。
例如 <count>0</count> 解析为 { count: "0" }(字符串),而非数字 0。
License
MIT © mityburner
