我正在尝试使用jQuery来解析内存中的XML文档。除了IE(震撼)之外,这在一切都很好。一些谷歌搜索显示问题很可能是因为IE将我的文档视为HTML而不是XML MIME类型。
有没有办法让我的jQuery implmentation工作,还是我必须检查客户端浏览器并实现IE特定的XML解析?
谢谢!
function getQAData(xmlData) {
var dataArr = new Array();
$(xmlData).find('item').each(function() {
dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
});
return dataArr; // this array is nice and populated in everything but ie
XML示例
<hwroot>
<data pid="">
<item cellID="24_951">
<question>Are you there?</question>
<answer>No</answer>
</item>
<item cellID="24_957">
<question>A Question?</question>
<answer>blah blah blah</answer>
</item>
</data>
</hwroot>
解决方案:
我的jQuery .find()解决方案不适用于@treeface下面描述的原因。这是我的解决方案:
基于导航器的分支JS代码:(
if (browserName == "Microsoft Internet Explorer") {
MsXmlParse(xmlData, dataArr);
} else {
$(xmlData).find('item').each(function() {
dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
});
}
MsXmlParse的定义
function MsXmlParse(xmlDocument, qarray) {
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = "false";
xmldoc.loadXML(xmlDocument);
var itemElements = xmldoc.getElementsByTagName("item");
for (var i = 0; i < itemElements.length; i++) {
var questionCellID = itemElements[i].getAttributeNode("cellID").nodeValue;
var answerTxt = itemElements[i].childNodes[1].text;
qarray.push({ questionid: questionCellID, answer: answerTxt });
}
} //结束msxmlparse
答案 0 :(得分:5)
我对此没有任何问题,你可以在这里看到:
http://jsfiddle.net/treeface/VuwcH/
我的猜测是,在IE中,你首先没有正确地解析你的XML数据,但除非你向我们展示那个xmlData变量的输出,否则无法判断。正如您在我的示例中所看到的,您需要使用除DOMParser
对象之外的其他内容才能在IE中正确解析XML字符串。你必须这样做:
xmlData = new ActiveXObject("Microsoft.XMLDOM");
xmlData.async = "false";
xmlData.loadXML(text); //where text is your XML string
修改强>:
好的,这里的问题是你的xmlData
对象是一串XML吗?您在帖子中提到它是“内存中的XML文档”,在这种情况下它会在IE中运行。据我所知,xmlData实际上是一个字符串,而这就是问题出现的地方。 IE是唯一一个在HTML节点中放置不兼容HTML的主要浏览器。由于jQuery的XML解析器将提供的字符串包装在div
中,因此它在IE中会崩溃。 jQuery认识到这个错误,他们认为这是一个“无法修复”的问题。
问题在这里:http://bugs.jquery.com/ticket/3143
不修复的原因:检查此链接:http://api.jquery.com/jQuery#jQuery2 jQuery构造函数仅支持html,而不支持xml。该字符串被刷新为div,这可能是IE爆炸的原因。因为字符串无效html。
特别是这一点:
当HTML比没有属性的单个标签更复杂时,如上例所示,元素的实际创建由浏览器的
innerHTML
机制处理。在大多数情况下,jQuery会创建一个新的<div>
元素,并将该元素的innerHTML
属性设置为传入的HTML代码段。当参数具有单个标记时,例如$('<img/>')
或$('<a></a>')
,jQuery使用本机JavaScriptcreateElement()
函数创建元素。传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM。例如,版本8之前的Internet Explorer会将链接上的所有href属性转换为绝对URL,而版本9之前的Internet Explorer将无法正确处理HTML5元素,而无需添加单独的兼容性层。
所以我怀疑他们“不会修复”它,因为否则所有其他浏览器的东西都会变得松散。我不确定这个答案的真实性(或者他们决定背后的逻辑质量)但是就是这样。
所以...简而言之(太迟了?)......不,没有简单的方法可以在一行中处理这个问题。再说一次,也不应该阻止你使用JSON而不是XML。
答案 1 :(得分:3)
jQuery的普通jQuery()
/ $()
函数不会将您传递给它的字符串解析为XML:它假装它是HTML,而这通常不起作用。但是,您可以使用jQuery 1.5的新parseXML
方法:
var xmlDoc = $.parseXML(xmlData);
答案 2 :(得分:0)
所有版本的IE或IE7都存在问题吗?我在使用jQuery之前使用IE解析XML时遇到了困难,修复程序最终使用不同的选择器来获取数据。
忘记寻找物品。例如,尝试使用“cellID”属性查找所有项目。
答案 3 :(得分:0)
解决方法可能是创建shivs个元素。
答案 4 :(得分:0)
工作正常!!!试试这个,
铬/火狐:
xml.children[0].childNodes[1].innerHTML
IE8 + / Safari浏览器:
xml.childNodes[0].childNodes[1].textContent
IE8:
xml.documentElement.childNodes[1].text;
示例代码,
var xml = $.parseXML(XMLDOC);
Var xmlNodeValue = "";
if(userAgent.match("msie 8.0")){
xmlNodeValue = xml.children[0].childNodes[1].innerHTML;
}else{ // IE8+
xmlNodeValue = xml.childNodes[0].childNodes[1].textContent;
}