如何在正确包含 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 标签周围的引用,如下所示:
项目数组(下图)正确地为我提供了所有可用的图片;但是在描述标签中,它给了我一个未定义的对象,而不是给我我正在寻找的 "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>
我正在尝试为 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 标签周围的引用,如下所示:
项目数组(下图)正确地为我提供了所有可用的图片;但是在描述标签中,它给了我一个未定义的对象,而不是给我我正在寻找的 "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()
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>