Javascript:简单的xml请求

Rya*_*yan 0 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);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

Error: xml.getElementsByTagName is not a function
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

car*_*ira 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产地.HTTP://本地主机:54671不被允许访问控制允许-起源." 由于此错误,请求对象的responseXML属性将为null,您将看到错误.

关于跨域XMLHttpRequest还有其他问题,您可以在其中找到解决问题的方法,例如跨站点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>
Run Code Online (Sandbox Code Playgroud)