如何正确地将XML转换为JS对象,同时正确包含CDATA

问题描述:

我正在尝试构建一个基于Web的RSS阅读器应用程序。我遇到的问题是,当我从RSS读取XML并将其转换为JavaScript对象时;任何包裹在[![CDATA]]中的东西都会给我一个未定义的对象。下面是我使用的是什么:如何正确地将XML转换为JS对象,同时正确包含CDATA

function XML2jsobj(node) { 

var data = {}; 

// append a value 
function Add(name, value) { 
    if (data[name]) { 
     if (data[name].constructor != Array) { 
      data[name] = [data[name]]; 
     } 
     data[name][data[name].length] = value; 
    } 
    else { 
     data[name] = value; 
    } 
}; 

// element attributes 
var c, cn; 
for (c = 0; cn = node.attributes[c]; c++) { 
    Add(cn.name, cn.value); 
} 

// child elements 
for (c = 0; cn = node.childNodes[c]; c++) { 
    if (cn.nodeType == 1) { 
     if (cn.childNodes.length == 1 && cn.firstChild.nodeType == 3) { 
      // text value 
      Add(cn.nodeName, cn.firstChild.nodeValue); 
     } 
     else { 
      // sub-object 
      Add(cn.nodeName, XML2jsobj(cn)); 
     } 
    } 
} 

return data; 

}

var url = "http://rss.cnn.com/rss/cnn_world.rss"; 
var url1 = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20'"+url+"'"; 
function getWithJQ2(){ 
    $.get(url1, function (data) { 
     console.log("data:",data); 
     var items = XML2jsobj(data.getElementsByTagName('channel')[0]); 
     responseFeed = items; 
      console.log("First article:",responseFeed.item[0]); 



     console.log("items:",items); 


    }); 
} 

我使用的RSS提要http://rss.cnn.com/rss/cnn_world.rss。 如前所述,所有对象都已正确创建,但如果您注意到;标签缠绕在CDATA上,并且在控制台中快速查看它们显示为空对象。我不太确定,如果我提供了足够的有关这个问题的信息,但是我一直坚持这一点。

CDATA部分的nodeType部分为4,因此您可以通过在同一位置检查文本节点来检查当前代码的工作情况。

前:

if (cn.childNodes.length == 1 && cn.firstChild.nodeType == 3) { 

后:

if (cn.childNodes.length == 1 && 
    (cn.firstChild.nodeType == 3 || cn.firstChild.nodeType === 4)) { 
+0

在控制台这给了我:test.js:89遗漏的类型错误:在XML2jsobj无法读取空 的特性 '节点类型'(test.js :jquery.min.js:2) at Object.fireWith [jWery.min.js:2]在Object.success(test.js:9) at o(jquery.min.js:2) .min.js:4) 在XM LHttpRequest.d(jquery.min.js:4) –

+0

Nevermind;必须添加: cn.childNodes.length == 1 && cn.firstChild.nodeType === 4)谢谢! –