2011-09-07 60 views
1

我已經以XML格式請求來自CGI的數據。我這樣做異步,有一個回調函數,像這樣:解析CGI的XML輸出的問題

var serverData; 
function serverDataCallback(event) { 
    if (event.target.readyState === 4) { 
     if(event.target.status === 200) { 
      var serverData = event.target.responseXML; 
    } 
} 

如果我console.log的情況下,我得到一個XMLHttpRequestProgressEvent

target.responseXML正是我想要的東西,它看起來像這樣在Chrome調試控制檯Document類型:

<Params> 
    <VCA> 
     <Ch0> 
      <enable>yes</enable> 
     </Ch0> 
    </VCA> 
</Params> 

但是,我不知道如何處理這些信息!我有看很多的教程和下面不起作用:

serverData.getElementByTagName('Ch0')[0].getElementByTagName('enable')[0] 

只是有一個例外,說getElementByTagName不存在。

如果我console.log其報告爲Document

我從來沒有做過一個XML HTTP請求之前返回XML,所以真的不知道我在做什麼的serverData!任何人都可以點亮一下嗎?

回答

1

如果你想使用DOM(就像你在你的例子中那樣),你需要像XML文檔一樣精細地遍歷元素樹。您還需要正確拼寫功能;它被稱爲getElementsByTagName而不是getElementByTagName,因爲標籤名稱沒有任何唯一性,因此該方法將返回一組匹配元素。一個DOM的解決辦法是這樣的:

var xhr = new XMLHttpRequest(); 

xhr.onreadystatechange = function() { 
    if ((this.readyState == 4) && (this.status == 200)) { 
    var paramsElement = this.responseXML.getElementsByTagName('Params')[0]; 
    var vcaElement = paramsElement.getElementsByTagName('VCA')[0]; 
    var chElement = vcaElement.getElementsByTagName('Ch0')[0]; 
    var enableElement = chElement.getElementsByTagName('enable')[0]; 
    var enable = enableElement.data; 

    console.debug(enable); 
    } 
}; 

xhr.open('GET', 'test.xml'); 
xhr.send(); 

有當然應該檢查這裏(每次調用getElementsByTagName可能返回null)很多錯誤,但它有望讓你開始。我想,然而,鼓勵你不要直接使用DOM或XmlHttpRequest,而是一個抽象像jQuery

$.get('test.xml', function(data, textStatus, xhr) { 
    var $enable = $(data).find('Params VCA Ch0 enable'); 
    var enable = $enable.text(); 
    console.debug(enable); 
}, 'xml'); 

正如你所看到的,它少得多的代碼,你從XML到一個jQuery得到很好的翻譯對象比DOM對象強大得多。

+0

謝謝,我是一個愚蠢的拼寫錯誤的功能。我明天工作時會看看。我從不肯定依賴jQuery,因爲這需要其他人可以使用的JavaScript命名空間。我不確定是否可以強制依賴於jQuery。 –