使用js创建易于编写,易于测试的本地移动应用程序很有趣。我的移动应用程序连接到许多社交网络API,其中一些仅提供XML响应。我的迷你“框架”使用JSON动态创建小部件,因此我需要一种将XML转换为JSON的方法。我发现了许多解决方案,但没有一个起作用。调整现有功能后,我发现了一个很好的解决方案。
重要的是要指出Titanium的Titanium.XML.DOMDocument对象实现DOM2级结构。这是神奇的XML到JSON代码:
// Changes XML to JSONfunction xmlToJson(xml) { // Create the return object var obj = {}; if (xml.nodeType == 1) { // element // do attributes if (xml.attributes.length > 0) { obj["@attributes"] = {}; for (var j = 0; j < xml.attributes.length; j ) { var attribute = xml.attributes.item(j); obj["@attributes"][attribute.nodeName] = attribute.nodeValue; } } } else if (xml.nodeType == 3) { // text obj = xml.nodeValue; } // do children if (xml.hasChildNodes()) { for(var i = 0; i < xml.childNodes.length; i ) { var item = xml.childNodes.item(i); var nodeName = item.nodeName; if (typeof(obj[nodeName]) == "undefined") { obj[nodeName] = xmlToJson(item); } else { if (typeof(obj[nodeName].push) == "undefined") { var old = obj[nodeName]; obj[nodeName] = []; obj[nodeName].push(old); } obj[nodeName].push(xmlToJson(item)); } } } return obj;};
我需要实现的主要更改是使用attributes.item(j)而不是使用attributes[j]我发现的大多数脚本。使用此功能,XML如下所示:
<ALEXA VER="0.9" URL="davidwalsh.name/" HOME="0" AID="="> <SD TITLE="A" FLAGS="" HOST="davidwalsh.name"> <TITLE TEXT="David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else"/> <LINKSIN NUM="1102"/> <SPEED TEXT="1421" PCT="51"/> </SD> <SD> <POPULARITY URL="davidwalsh.name/" TEXT="7131"/> <REACH RANK="5952"/> <RANK DELTA="-1648"/> </SD></ALEXA>
成为具有以下结构的js对象是可行的:
{ "@attributes": { AID: "=", HOME: 0, URL: "davidwalsh.name/", VER: "0.9", }, SD = [ { "@attributes": { FLAGS: "", HOST: "davidwalsh.name", TITLE: A }, LINKSIN: { "@attributes": { NUM: 1102 } }, SPEED: { "@attributes": { PCT: 51, TEXT: 1421 } }, TITLE: { "@attributes": { TEXT: "David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else", } }, }, { POPULARITY: { "@attributes": { TEXT: 7131, URL: "davidwalsh.name/" } }, RANK: { "@attributes": { DELTA: "-1648" } }, REACH: { "@attributes": { RANK = 5952 } } } ]}
从这里可以使用js对象,但您认为合适。如果您想使用JSON字符串格式的js,可以编写以下代码:
var jsonText = JSON.stringify(xmlToJson(xmlDoc))
此功能在允许我快速忽略XML并改用JSON时非常有用。当构造嵌套子节点的属性和数组时,该函数运行良好。保持方便;在某些时候,可能需要将XML转换为JSON!