2014-04-09 57 views
0

我正在嘗試將XML文件讀取到使用JavaScript的對象,最終解析它以獲取信息並轉換其中的數據。xmlHttp.responseXML似乎爲空 - .responseText被正確填充

XML文件格式正確(在同一個域中),我將它粘貼到了幾個驗證器,並且所有的驗證器都沒有錯誤地返回,所以這不應該是錯誤的根源。

我想通過ajax/xmlHttpRequest訪問文件。以下是有關部分的代碼片段:

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回到空,但是,沒有確定的方法來檢查,因爲如果我警告(xmlHttp.reponseXML)它只是告訴我,一個對象返回,但不是它...

有沒有人有一個想法,爲什麼這整個事情不起作用?我發現最令人困惑的是,.response文本工作正常......

+0

用console.log(reponseXML)而不是alert(reponseXML)打印reponseXML對象。您將在瀏覽器控制檯中擁有此對象的完整結構。同時檢查服務器返回的MIME類型:它必須是text/xml – Thomas

+0

如何檢查MIME類型?目前我正在使用XAMPP,而不是真正的網絡服務器。除此之外,我已經嘗試了使用content-type作爲text/xml的POST請求。它有相同的結果。我會嘗試console.log。在該說明中,執行時控制檯中沒有錯誤。 – daZza

+0

好的謝謝你的提示。控制檯日誌中有完整的文檔:) – daZza

回答

1

rs:data不是標籤名稱。 urn:schemas-microsoft-com:rowset命名空間中的標記名稱爲data(由xmlns:rs='urn:schemas-microsoft-com:rowset'指定)。

您應該使用支持名稱空間的DOM方法。

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

謝謝,這很有幫助。我沒有意識到XML文件中有名稱空間和類似的東西,我的不好。該警報現在返回預期的「1」。你知道一個簡單的方法來讀出節點的屬性嗎?我認爲通過childNodes []的數組索引很難做到這一點 – daZza