如何在正确包含CDATA

时间:2017-06-08 18:45:37

标签: javascript jquery xml cdata

我正在尝试构建一个基于Web阅读器的RSS阅读器。我遇到的问题是,当我从RSS读取XML并将其转换为javascript对象时;包含在[![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 Feed是http://rss.cnn.com/rss/cnn_world.rss。 如前所述,如果您注意到,所有对象都已正确创建;标签包裹在CDATA周围,在控制台中快速查看它们是空对象。我不太确定我是否提供了有关此问题的足够信息,但我已经坚持了一段时间。

1 个答案:

答案 0 :(得分:0)

nodeType部分的CDATA4,因此您可以在检查文本节点的同一位置检查当前代码是否有效。

在:

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

后:

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