【问题标题】:Is XPATH supported in Internet Explorer?Internet Explorer 是否支持 XPATH?
【发布时间】:2012-04-27 18:31:28
【问题描述】:

请检查以下代码,它在 Firefox 中运行良好,但在 Internet Explorer 中无法运行。

谁能帮我解决这个问题?

HTML 文件:(finaltest.html)

<html>
    <head>
        <title>This is testing</title>
        <script type="text/javascript">
            var items= new Array();
            var details = new Array();
            var contents = new Array();

            function allCall()
            {
                readXMLUsingXPATH();
                populateList();
            }
            function populateList()
            {
                for(var list=0; list<items.length; list++){
                    var temp= new Option(items[list],items[list]);
                    document.getElementById('sel').options.add(temp);
                    //alert("in populatelist");
                }
            }

            function addContent(divName, content) 
            {
                //alert(content);
                document.getElementById(divName).innerHTML = content;
            }

            function loadXML(){
                var xmlhttp;
                if(window.XMLHttpRequest){
                    xmlhttp = new XMLHttpRequest();
                }
                else{
                    xmlhttp = new ActiveXObject("Micrsoft.XMLHTTP");
                }
                xmlhttp.open("GET","details.xml",false);
                xmlhttp.send();
                return xmlhttp.responseXML;
            }

            function readXMLUsingXPATH(){
                var xmlDoc = loadXML();
                if(xmlDoc == null){
                    alert("XML HTTP object is null");
                    return;
                }
                var path1 = "/Root/Item/name";
                var path2 = "/Root/Item/details";
                var path3 =  "/Root/Item/content";
                var xmlNoadList1,xmlNoadList2,xmlNoadList3,result1,result2,result3,name,detail,content,list;
                if(window.ActiveXObject){
                    xmlNoadList1 = xmlDoc.selectNodes(path1);
                    xmlNoadList2 = xmlDoc.selectNodes(path2);
                    xmlNoadList3 = xmlDoc.selectNodes(path3);
                    for(list=0; list<xmlNoadList1.length; list++){
                        items[list]=xmlNoadList1[list].childNodes[0].nodeValue;
                        name = xmlNoadList1[list].childNodes[0].nodeValue;
                    }
                    for(list=0; list<xmlNoadList2.length; list++){
                        details[list]=xmlNoadList2[list].childNodes[0].nodeValue;
                        detail = xmlNoadList2[list].childNodes[0].nodeValue;
                    }
                    for(list=0; list<xmlNoadList3.length; list++){
                        contents[list]=xmlNoadList3[list].childNodes[0].nodeValue;
                        content = xmlNoadList3[list].childNodes[0].nodeValue;
                    }

                }
                else if(document.implementation && document.implementation.createDocument){
                    xmlNoadList1 = xmlDoc.evaluate(path1, xmlDoc, null, XPathResult.ANY_TYPE, null);
                    xmlNoadList2 = xmlDoc.evaluate(path2, xmlDoc, null, XPathResult.ANY_TYPE, null);
                    xmlNoadList3 = xmlDoc.evaluate(path3, xmlDoc, null, XPathResult.ANY_TYPE, null);
                    result1 = xmlNoadList1.iterateNext();
                    result2 = xmlNoadList2.iterateNext();
                    result3 = xmlNoadList3.iterateNext();
                    list=0;
                    while(result1){
                        name = result1.childNodes[0].nodeValue;
                        items[list]=result1.childNodes[0].nodeValue;
                        result1 = xmlNoadList1.iterateNext();
                        list++;
                    }
                    list=0;
                    while(result2){
                        detail = result2.childNodes[0].nodeValue;
                        details[list]=result2.childNodes[0].nodeValue;
                        result2 = xmlNoadList2.iterateNext();
                        list++;
                    }
                    list=0;
                    while(result3){
                        content = result3.childNodes[0].nodeValue;
                        contents[list]=result3.childNodes[0].nodeValue;
                        result3 = xmlNoadList3.iterateNext();
                        list++;
                    }
                }
            //alert("in xml");
            }
            function itemDetails(name,ind){
                //alert(details[ind]);
                document.getElementById(name).innerHTML = details[ind] + "</br>" + contents[ind];
            }

        </script>
    </head>
    <body >

        <form name="myForm">
            Content to be added:
            <SELECT name="sel" id="sel" size="4" onChange="addContent('result', this[this.selectedIndex].text);">
            </SELECT>
            <input type="button" value="Details" onClick="itemDetails('result', document.getElementById('sel').selectedIndex)">
        </form>
        <br><br>
        Your content will be added dynamically below:
        <div id="result"></div>
        <script type="text/javascript">
        onload=allCall;
        </script>
    </body>
</html>

XML 文件:(details.xml)

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Item>
        <name>Item1</name>
        <details>Item1 Details</details>
        <content>Item1 Content</content>
    </Item>
    <Item>
        <name>Item2</name>
        <details>Item2 Details</details>
        <content>Item2 Content</content>
    </Item>
    <Item>
        <name>Item3</name>
        <details>Item3 Details</details>
        <content>Item3 Content</content>
    </Item>
    <Item>
        <name>Item4</name>
        <details>Item4 Details</details>
        <content>Item4 Content</content>
    </Item>
    <Item>
        <name>Item5</name>
        <details>Item5 Details</details>
        <content>Item5 Content</content>
    </Item>
    <Item>
        <name>Item6</name>
        <details>Item6 Details</details>
        <content>Item6 Content</content>
    </Item>
    <Item>
        <name>Item7</name>
        <details>Item7 Details</details>
        <content>Item7 Content</content>
    </Item>
    <Item>
        <name>Item8</name>
        <details>Item8 Details</details>
        <content>Item8 Content</content>
    </Item>
</Root>

【问题讨论】:

  • TL;博士。想出可能出现问题的最小代码。

标签: javascript internet-explorer xpath cross-browser


【解决方案1】:

您还没有说明当您使用 IE 运行代码示例时究竟发生了什么,您尝试了哪个版本的 IE,您针对哪个语句遇到了哪个错误。一个可能的问题只是代码中的拼写错误,而不是xmlhttp = new ActiveXObject("Micrsoft.XMLHTTP"),您需要xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")。这是否是导致问题的代码部分很难说,这取决于 IE 版本及其设置是否使用了该代码分支。

【讨论】:

  • 它在 "xmlhttp.open("GET","details.xml",false);" 处给出错误因为访问被拒绝,我正在使用 IE9 beta。
  • 好吧,使用早已发布的浏览器的 beta 版本让大多数人很难重现问题,因为现在大多数人将使用 IE 9 的最终版本而不是 beta。无论如何,我们需要了解更多细节,您是通过 HTTP 从 HTTP 服务器还是直接从文件系统加载带有脚本的 HTML 文档?你调试你的代码,当你得到错误时,你检查是XMLHttpRequest分支已经被使用还是新的ActiveXObject分支?
  • 是的,我调试了代码。我认为错误是因为 XMLHttpRequest 分支。在“xmlhttp.open("GET","details.xml",false);"处出现“拒绝访问”错误。
  • 你确定它是一个相对 URL,如“details.xml”,它给你一个访问被拒绝?我将您的代码示例上传到home.arcor.de/martin.honnen/javascript/2011/07/…,它在 IE 9 上运行良好(当然是最终版本,不再有任何测试版)。
  • 对不起,我不知道为什么它不适合你。第一个建议显然是安装最终的 IE 9 版本而不是使用测试版。然后再次尝试发布的案例。我们也可以在这里请其他读者测试是否有其他人遇到您所说的“访问被拒绝”错误,然后我们需要比较不同 IE 安装的设置。但这一切都与 XPath 无关看来,当涉及到 XMLHttpRequest 时,而不是 IE 的安装和配置问题。
【解决方案2】:

根据博客文章

Internet Explorer(至少到 IE8)没有在 document 上实现 DOM Level 3 XPath Specs,而是通过 XML 文档上的 MSXML2.DOMDocument ActiveX 对象提供它自己的实现。

【讨论】:

  • 我已经使用了 MSXML2.DOMDocument 对象,但它仍然无法在 Internet Explorer 中运行。你能给我举一个在 Internet Explorer 中运行良好的示例吗?
  • @Priyanka 我上面链接的文章有例子
【解决方案3】:

IE 9 中的一个缺陷是它支持一些以前与其他浏览器相关联的方法。例如,我有一个在 IE 8 和 Firefox 中运行的代码,但在 IE 9 中没有。解释很简单:IE 9 试图运行 Firefox 分支,当然失败了:IE9 不支持 document.evaluate Xpath的方法。

    // Code for Firefox
    // Wrong!
    if ( document.implementation && document.implementation.createDocument ) {  
    // stops IE8, but not IE9 from running the below code
    // do some Xpath stuff ie. document.evaluate(//more code here )}

    // Correct
    if ( navigator.appName != "Microsoft Internet Explorer" ) {  

    // stops IE 8 and IE 9 from running the below code
    // do some Xpath stuff  ie. document.evaluate(//more code here )   }

【讨论】:

  • 我建议不要这样做。特征检测总是比浏览器名称黑名单更强大。问题不是你在做特征检测,而是你做错了;如果你使用的是document.evaluate,你应该测试document.evaluate(而不是document.dimplementation.createDocument)。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2023-03-26
  • 2011-07-03
  • 2023-04-03
相关资源
最近更新 更多