【问题标题】:xmlHttp.responseXML seems empty - .responseText is correctly filledxmlHttp.responseXML 似乎为空 - .responseText 已正确填充
【发布时间】:2023-03-29 17:20:02
【问题描述】:

我正在尝试使用 JavaScript 将 XML 文件读取到对象中,以最终解析它以获取信息并转换其中的数据。

XML 文件格式正确(并且在同一个域中),我将它粘贴到了几个验证器,并且都没有错误地返回,所以这不应该是错误的来源。

我正在尝试通过 ajax / xmlHttpRequest 访问该文件。这是相关部分的代码sn-p:

if (xmlHttp)
    {
        var url = xmlFile;
        xmlHttp.open("GET", url, true);
        xmlHttp.onreadystatechange = function() 
        {
            if (xmlHttp.readyState == 4)
            {
                //alert(xmlHttp.responseText);
                var xmlData = xmlHttp.responseXML;
                var txt="";
                var x=xmlData.getElementsByTagName("rs:data");

                alert(x.length);

                for (i=0;i<x.length;i++)
                {
                    txt=txt + x[i].childNodes[0].nodeValue + "<br>";
                }   
            }
        }
        xmlHttp.send();
    }

现在的问题是变量“x”总是返回为空(长度 = 0)。但是,当我警告 responseText 时,我可以在警告消息中看到整个 xml 文件,这对我来说似乎很奇怪。

xml文件基本上是这样的:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
 xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
 xmlns:rs='urn:schemas-microsoft-com:rowset'
 xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>
  <s:AttributeType name='ows_Art' rs:name='Art' rs:number='1'>
     <s:datatype dt:type='string' dt:maxLength='512' />
  </s:AttributeType>
</s:ElementType>
</s:Schema>
  <rs:data>
    <z:row [...] />
  </rs:data>
</xml>

我想要的是节点下存储的所有数据以及我可以从中学到的东西

var x=xmlData.getElementsByTagName("rs:data");

应该这样做。我能想到的唯一原因是 .responseXML 返回为空,但是,没有确定的检查方法,因为如果我 alert(xmlHttp.reponseXML) 它只是告诉我,返回了一个对象,而不是返回的内容它...

有没有人知道为什么这整件事不起作用?我发现最令人困惑的是, .responseText 工作正常......

【问题讨论】:

  • 使用 console.log(reponseXML) 而不是 alert(reponseXML) 打印 reponseXML 对象。您将在浏览器控制台中看到该对象的完整结构。还要检查服务器返回的 mime 类型:它必须是 text/xml
  • 如何检查 MIME 类型?我目前正在使用 XAMPP,而不是真正的网络服务器。除此之外,我已经尝试了一个内容类型为 text/xml 的 POST 请求。结果是一样的。我会试试console.log。请注意,执行时控制台中没有错误。
  • 好的,谢谢你的提示。控制台日志中有完整的文档:)

标签: javascript jquery ajax xml xmlhttprequest


【解决方案1】:

rs:data 不是标签名称。标记名称是dataurn:schemas-microsoft-com:rowset 命名空间中(由xmlns:rs='urn:schemas-microsoft-com:rowset' 指定)。

您应该使用可识别命名空间的 DOM 方法。

var x = xmlData.getElementsByTagNameNS("urn:schemas-microsoft-com:rowset", "data");

【讨论】:

  • 谢谢,帮助很大。我没有意识到 XML 文件中有名称空间和类似的东西,我的错。警报现在返回预期的“1”作为结果。您知道读取 节点及其属性的简单方法吗?我认为通过 childNodes[] 的数组索引来做到这一点相当困难
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 2021-03-03
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多