Javascript:简单的xml请求

时间:2011-07-30 00:01:22

标签: javascript xml

我正在学习这些东西,所以我的代码可能不太漂亮......但是会感激一些帮助:)

我没有编写以下代码,但是从网上的其他地方获得了这些代码:

function text_xml()
{
    realXmlUrl="http://jumac.com/del_me_fruits.xml";
    http_request = false;
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType)
    {
        http_request.overrideMimeType('text/xml');
    }

    http_request.onreadystatechange = this.response_xml;
    http_request.open('GET', realXmlUrl, true);
    http_request.send(null);
    xmlDoc = http_request.responseXML;
}

function response_xml()
{
    if (self.http_request.readyState == 4)
    {
        document.getElementById("ex").appendChild(document.createTextNode(" Done!"));
        getFruits(http_request.responseText);
    }
}

function getFruits(xml) {
  var fruits = xml.getElementsByTagName("fruits")[0];
  if (fruits) {
    var fruitsNodes = fruits.childNodes;
    if (fruitsNodes) {
      for (var i = 0; i < fruitsNodes.length; i++) {
        var name = fruitsNodes[i].getAttribute("name");
        var colour = fruitsNodes[i].getAttribute("colour");
        alert("Fruit " + name + " is coloured " + colour);
      }
    }
  }
}

我得到的错误是:

Error: xml.getElementsByTagName is not a function

我做错了什么?

3 个答案:

答案 0 :(得分:5)

responseText是一个字符串,而不是XML。您在寻找responseXML吗?

<强>更新

如果您的脚本是从与您正在加载的XML文档不同的域加载(http://jumac.com/del_me_fruits.xml),那么XMLHttpRequest将在浏览器上采取不同的处理方式。

在IE 8上,它会弹出一个警告窗口,抱怨“该页面正在访问不受其控制的信息。这会带来安全风险。你想继续吗?”如果你单击是,那么它将正常工作(即,将加载XML并显示水果的警报)。

但是,在Chrome 12上,它不会弹出任何内容,并且会说“XMLHttpRequest无法加载http://jumac.com/del_me_fruits.xml。Access-Control-Allow-Origin不允许原始http://localhost:54671。”由于此错误,请求对象的responseXML属性将为null,您将看到错误。

关于跨域XMLHttpRequest还有其他问题,您可以在其中找到解决问题的方法,例如Cross-site XMLHttpRequesthttp://code.google.com/chrome/extensions/xhr.html

<body>
    <script type="text/javascript">
        function text_xml() {
            realXmlUrl = "http://jumac.com/del_me_fruits.xml";
            http_request = false;
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }

            http_request.onreadystatechange = this.response_xml;
            http_request.open('GET', realXmlUrl, true);
            http_request.send(null);
            xmlDoc = http_request.responseXML; // this doesn't have anything
        }

        function response_xml() {
            if (self.http_request.readyState == 4) {
                document.getElementById("ex").appendChild(document.createTextNode(" Done!"));
                getFruits(http_request.responseXML);
            }
        }

        function getFruits(xml) {
            var fruits = xml.getElementsByTagName("fruits")[0];
            if (fruits) {
                var fruitsNodes = fruits.childNodes;
                if (fruitsNodes) {
                    for (var i = 0; i < fruitsNodes.length; i++) {
                        var name = fruitsNodes[i].getAttribute("name");
                        var colour = fruitsNodes[i].getAttribute("colour");
                        alert("Fruit " + name + " is coloured " + colour);
                    }
                }
            }
        }
    </script>

    <input type="button" value="Click me" onclick="text_xml();" />
    <p><div id="ex"></div></p>
</body>

答案 1 :(得分:0)

在跨服务器传输数据时,我通常喜欢使用字典。

MkNxGn.pro提供了一种通过MkNxGn Proquest发出XML HTTP请求的简洁方法。

加载请求,可以与代码分开
<script src="https://mknxgn.pro/scripts/Proquest_Proquest-v1.0.js"></script>

<script> Proquest("POST", URL_HERE, DATA,<br> HEADERS, RType, Ignore JSON errors, Callback); </script>

这样,您可以轻松编写:

<script> Proquest("GET", "http://jumac.com/del_me_fruits.xml", Skip, {'Content-type': 'text/xml'}, 'response', false, function(resp) { resp.overrideMimeType('text/xml'); //Looks like you want it to be XML if its not. document.getElementById("ex").appendChild(document.createTextNode(" Done!")); getFruits(resp.responseXML); }); </script>

忽略 jason的编辑以更好地重写它。

答案 2 :(得分:-1)

考虑使用像jquery这样的javascript库。

jquery ajax几乎是自我解释,你不必混淆浏览器兼容性。 http://jquery.com/