【问题标题】:why i can't parse xml in javascript?为什么我不能在 javascript 中解析 xml?
【发布时间】:2011-06-11 13:46:14
【问题描述】:

你好我有问题解析 xml.. 我有这样的 xml:

<tejemahan>
  <kategori> komputer </kategori>
  <hasil> aplikasi komputer </hasil>
</terjemahan>

已编辑: 上面的 xml 我是这样得到的:

   var url="http://localhost:8080/inlinetrans/api/translate/"+userSelection+"/"+hasilStemSel+"/"+hasilStem;
   var client = new XMLHttpRequest();
   client.open("GET", url, false);
   client.setRequestHeader("Content-Type", "text/plain");
   client.send(null);

   if(client.status == 200)
       alert("the request success"+client.responseText);
   else
       alert("the request isn't success"+client.status+""+client.statusText)

  }

这是我解析上述 xml 文件的代码:

this.loadXML = function (){
   var url = http://localhost:8080/coba/api/artikan/"+sel+"/"+hasilStemSel+"/"+hasilStem
   xmlDoc=document.implementation.createDocument("","",null);
   xmlDoc.load("url");
   xmlDoc.onload= this.readXML;
  }

  this.readXML = function() {
        alert(xmlDoc.documentElement.tagName);
 alert(xmlDoc.documentElement.childNodes[0].tagName);
 alert(xmlDoc.documentElement.childNodes[1].tagName);
 alert(xmlDoc.documentElement.childNodes[0].textContent);
 alert(xmlDoc.documentElement.childNodes[1].textContent);

     }

我可以执行这段代码

xmlDoc=document.implementation.createDocument("","",null); 
xmlDoc.load("url");

但是为什么我不能执行这段代码 xmlDoc.load = this.readXML ???

【问题讨论】:

  • 能否提供调用loadXML的代码?
  • 我在向服务器发出请求后调用 loadXML
  • 您为什么使用这种方法?跨浏览器更好地支持 XHR。 “document.load() 是旧版本的 W3C DOM Level 3 Load & Save 模块的一部分。可以与 document.async 一起使用来指示请求是同步的还是异步的(默认)。至少从 Gecko 开始1.9,这不再支持文档的跨站点加载(使用 XMLHttpRequest 代替)。” — developer.mozilla.org/en/DOM/document.load
  • 我已经回答了您的问题并向您展示了如何从您的XMLHttpRequest 获取 XML 文档。通过使用其responseXML 属性,您无需进行任何解析。

标签: javascript firefox xml-parsing


【解决方案1】:

尝试将 onload 处理程序分配放在 load() 调用之前。如果您首先调用 load(),onload 事件将在您分配处理程序来处理它之前发生。像这样:

xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.onload= this.readXML;
xmlDoc.load("url");

【讨论】:

    【解决方案2】:

    首先,我赞同 David Dorward 的建议:改用 XMLHttpRequest,它适用于所有主流浏览器。代码如下。

    其次,您的readXML 函数存在缺陷,因为大多数浏览器将在childNodes 集合中包含空白文本节点,因此xmlDoc.documentElement.childNodes[0] 实际上是一个文本节点并且没有tagName 属性。我建议在迭代childNodes 时使用getElementsByTagName() 或检查每个节点的nodeType 属性。

    第三,您的 XML 无效:&lt;tejemahan&gt;&lt;/terjemahan&gt; 不匹配,尽管这可能是您问题中的拼写错误。

    var url = "http://localhost:8080/coba/api/artikan/"+sel+"/"+hasilStemSel+"/"+hasilStem;
    
    var readXML = function(xmlDoc) {
        alert(xmlDoc.documentElement.tagName);
        var kategori = xmlDoc.getElementsByTagName("kategori")[0];
        alert(kategori.tagName);
    };
    
    var createXmlHttpRequest = (function() {
        var factories = [
            function() { return new XMLHttpRequest(); },
            function() { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); },
            function() { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); },
            function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
        ];
    
        for (var i = 0, len = factories.length; i < len; ++i) {
            try {
                if ( factories[i]() ) {
                    return factories[i];
                }
            }
            catch (e) {}
        }
    })();
    
    var xmlHttp = createXmlHttpRequest();
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            readXML(xmlHttp.responseXML);
        }
    };
    
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    

    【讨论】:

    • 它仍然无法工作 Tim..我使用了上面的代码,我得到了 childNode 长度,但我无法读取 xml 的内容
    • @user495688:您能否对您遇到的错误以及在哪里更具体一点?也许我们可以看到一个测试页面?
    • @user495688:我在我的示例 readXML 函数中添加了一个使用 getElementsByTagName() 的示例。
    • @user495688:我也错过了url 声明中的双引号,我现在已经修复了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多