如何在正确包含 CDATA 的同时正确地将 XML 转换为 JS 对象
How do I properly convert XML to JS Objects while properly containing CDATA
我正在尝试构建一个基于网络的 RSS reader 应用程序。我遇到的问题是,当我从 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 提要是 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)) {
我正在尝试构建一个基于网络的 RSS reader 应用程序。我遇到的问题是,当我从 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 提要是 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)) {