jQuery Find()和XML在IE中不起作用

时间:2011-02-14 23:03:00

标签: javascript jquery

我正在尝试使用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

5 个答案:

答案 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使用本机JavaScript createElement()函数创建元素。

     

传递复杂的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; 

}