当前位置: > > > JS - 实现XML与JSON数据的相互转换(使用xml2json.js)

JS - 实现XML与JSON数据的相互转换(使用xml2json.js)

一、基本介绍

1,x2js 介绍

x2js 是一个可以将 XML 数据转换成 JSON 对象,或者将 JSON 对象转成 XML 数据的的 JavaScript 库。它体积小巧,使用简单,而且不依赖任何其他的库。

2,安装配置

(1)首先到其 GitHub 主页下载库代码。

(2)然后在需要使用页面上将其引用进来即可。
<script type='text/javascript' src="xml2json.js"></script>

二、将 XML 转为 JSON

1,将 XML 字符串转换为 JSON 对象

//待转换的xml字符串
var xmlText = "<data id='123'><test>success</test><result>hangge.com</result></data>";

//创建一个x2js对象进行转换
var x2js = new X2JS();
var jsonObj = x2js.xml_str2json( xmlText );

//输出结果
console.log(jsonObj);

2,XML 属性值的访问

使用 x2js 转换时,原先 xml 节点上的属性名会自动添加一个下划线前缀(_),然后作为 json 对象的一个属性。
比如我们要获取原来 data 节点上的 id 这个属性值:
console.log(jsonObj.data._id);

3,修改默认的属性名前缀

(1)如果觉得默认添加的下划线前缀不好,可以通过 attributePrefix 配置项进行修改。
//待转换的xml字符串
var xmlText = "<data id='123'><test>success</test><result>hangge.com</result></data>";

//创建一个x2js对象进行转换
var x2js = new X2JS({
    attributePrefix : "$"
});
var jsonObj = x2js.xml_str2json( xmlText );

//输出结果
console.log(jsonObj);

(2)上面我们将默认前缀修改成“$”,转换后的结果如下:

4,处理并解析 XML 中的时间值

(1)比如我们有如下 xml 字符串需要转换,其中包含有时间值。
var xmlText = "<MyDts><testds>2002-10-10T12:00:00+04:00</testds></MyDts>";

(2)如果想要正确获取时间,有如下两种办法:
  • 转换前预先进行配置:
var x2js = new X2JS({
     datetimeAccessFormPaths : [
        "MyDts.testds"
     ]
});

var jsonObj = x2js.xml_str2json(xmlText);

console.log(jsonObj.MyDts.testds);

  • 转换后通过 x2js asDateTime 方法进行解析:
var x2js = new X2JS();
var jsonObj = x2js.xml_str2json(xmlText);

console.log(x2js.asDateTime(jsonObj.MyDts.testds));

(3)运行结果如下:

5,将 AJAX 请求结果转为JSON对象

这里以 jQuery 为例,将通过 AJAX 请求的 XML 数据转换成 JSON 对象。
$.ajax({
    type: "GET",
    url: "/test",
    dataType: "xml",
    success: function(xmlDoc) {
        var x2js = new X2JS();
        var jsonObj = x2js.xml2json(xmlDoc);
    }
});

6,读取 XML 文件并将内容转换为 JSON 对象

function loadXMLDoc(dname) {
    if (window.XMLHttpRequest) {
        xhttp=new XMLHttpRequest();
    }
    else {
        xhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttp.open("GET",dname,false);
    xhttp.send();
    return xhttp.responseXML;
}

var xmlDoc = loadXMLDoc("test.xml");
var x2js = new X2JS();
var jsonObj = x2js.xml2json(xmlDoc);

三、将 JSON 转为 XML

1,将 JSON 对象转换为 XML 字符串

//待转换的json对象
var jsonObj = {
   MyRoot : {
        test: 'success',
        test2 : {
            item : [ 'val1', 'val2' ]
        }
    }
};

//创建一个x2js对象进行转换
var x2js = new X2JS();
var xmlAsStr = x2js.json2xml_str(jsonObj);

//输出结果
console.log(xmlAsStr);

2,转换为 xml 的属性值

(1)默认情况下,JSON 对象里那些以下划线(_)开头的属性,都会被转为 XML 节点的属性(转换后会去除下划线)
//待转换的json对象
var jsonObj = {
   MyRoot : {
        test: 'success',
        _test2 : 'hangge.com'
    }
};

//创建一个x2js对象进行转换
var x2js = new X2JS();
var xmlAsStr = x2js.json2xml_str(jsonObj);

//输出结果
console.log(xmlAsStr);

(2)如果不喜欢“_”这个前缀,可以通过 attributePrefix 配置项进行修改。下面代码运行结果同上面的是一样的。
//待转换的json对象
var jsonObj = {
   MyRoot : {
        test: 'success',
        $test2 : 'hangge.com'
    }
};

//创建一个x2js对象进行转换
var x2js = new X2JS({
    attributePrefix : "$"
});
var xmlAsStr = x2js.json2xml_str(jsonObj);

//输出结果
console.log(xmlAsStr);

四、配置项介绍

初始化 X2JS 对象时可以进行一些默认配置的修改,比如上面代码中我们把属性前缀修改成“$”。
var x2js = new X2JS({
    attributePrefix : "$"
});

下面列举了所有的配置项,大家可以根据需求来使用:
  • escapeMode:是否转义 XML 字符(默认值:true
  • attributePrefixXML 属性在 JSON 对象中自动添加的前缀(默认值:_
  • arrayAccessForm:通过这个配置可以让所有的 XML 元素增加一个_asArray 属性,以便通过数组形式访问。(可选值:none | property。默认值:none
  • emptyNodeForm:如何处理空节点。设置为 text(默认值):解析为空字符串("")。设置为 object:解析为空对象({}
  • enableToStringFunc:在生成 JSON 对象时是否启用打印带有 text/cdata 的文本节点的功能。(默认值:true
  • arrayAccessFormPaths[] - 数组访问路径 - 使用此选项可以始终以“数组形式”配置 XML 元素的路径。您可以根据 XSD 或您的知识,预先将路径配置到所有阵列元素。每个路径都可以是一个简单的字符串(如“parent.child1.child2”),正则表达式(如 /.*.child2/)或自定义函数。(默认为空)
  • skipEmptyTextNodesForObj:跳过带有子节点的节点的空文本标签。(默认值:true
  • stripWhitespaces:去除空白,即 trimming 文本节点。(默认值:true
  • datetimeAccessFormPaths[] - DateTime 访问路径。使用此选项为 XML datetime 元素配置 XML 元素的路径。您可以根据 XSD 或您的知识,预先为所有 datetime 元素配置路径。每个路径都可以是一个简单的字符串(如“parent.child1.child2”),正则表达式(如 /.*.child2/)或自定义函数。(默认为空)
  • useDoubleQuotes:使用双引号输出 XML 格式。(默认值:false
  • xmlElementsFilter[] - 过滤传入的 XML 元素。您可以传递一个带格式的路径(如“parent.child1.child2”),正则表达式或函数。(默认为空)
  • jsonPropertiesFilter[] - 过滤输出 XML JSON 属性。您可以传递一个带格式的路径(如“parent.child1.child2”),正则表达式或函数。(默认为空)
  • keepCData:如果此属性定义为 false,并且 XML 元素仅具有 CData 节点,则将其转换为文本而不附加属性“__cdata”。(默认值:false
评论1
  • 1楼
    2017-12-28 17:44
    好好好

    为什么提示我x2js is not define
    我引js文件了啊?

    站长回复

    我又测试了下,只要引了就可以用的啊。不知道你那边是什么情况。