如何在正确包含 CDATA 部分的同时将 XML 正确转换为 JS 对象

How do I properly convert XML to JS Objects while properly containing sections of CDATA

我正在尝试为 500px.com 构建一个 RSS reader...我正在尝试使用此函数抓取 xml 文件的所有元素并将其排序到 JS 对象中:

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 || cn.childNodes.length == 1&& cn.firstChild.nodeType === 4) {
            // text value
            Add(cn.nodeName, cn.firstChild.nodeValue);
        }
        else {
            // sub-object
            Add(cn.nodeName, XML2jsobj(cn));
        }
    }
}

return data;

} 一切正常,并正确地为我提供了每个可用描述图像的数组,但是,它没有给我一个包裹在 CDATA 标签周围的引用,如下所示:

http://imgur.com/a/pneSy

项目数组(下图)正确地为我提供了所有可用的图片;但是在描述标签中,它给了我一个未定义的对象,而不是给我我正在寻找的 "img src =...".. 如果它提供了任何进一步的信息,这是我的启动代码:url = https://500px.com/popular.rss

var url = 500px.com/popular.rss;
function startApp(url){
var url1 = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20'"+url+"'";
function createTree(){
    $.get(url1, function (data) {
        console.log("data:",data);
        var items = XML2jsobj(data.getElementsByTagName('channel')[0]);
        console.log("Data / Channel:",data.getElementsByTagName('channel')[0]);
        var test = data.getElementsByTagName('channel')[0];

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


    });
}
createTree();

}

您可以使用 .text() 获取所有 description 元素的 .textContent.match()RegExp /<img\s.+>(?=<)/g 获取数组<img> 元素作为文本,可以使用 jQuery()

转换为 jQuery 对象或元素

function startApp(url) {

  var url1 = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%20%3D%20'" + url + "'";

  function createTree() {
    $.get(url1, function(data) {

      var images = $(data.documentElement)
        .find("description")
        .text()
        .match(/<img\s.+>(?=<)/g);
        
      var srcs = $.map(images, function(img) {
                   return $(img).attr("src")
                 });
                 
      console.log(images, srcs);
      
    });
  }
  createTree();
}

startApp("http://500px.com/popular.rss")
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>