2011-08-18 57 views
4

似乎沒有任何關於在Mootools中解析XML的有用文檔。要麼是這麼愚蠢的容易,沒人會提起它,或者每個人都放棄嘗試是非常困難的。有沒有人有任何簡單的跨瀏覽器方法來解析XML與Mootools?在Mootools中解析XML

這裏是我的小XML文件data.xml中:

<?xml version="1.0"?> 
<suggestions> 
    <suggestion winning="Y"> 
     <copy><![CDATA[Draw straws to see who wins]]> 
     </copy> 
     <person><![CDATA[Sue]]> 
     </person> 
     <location><![CDATA[London]]> 
     </location> 
    </suggestion> 
    <suggestion winning="N"> 
     <copy><![CDATA[Race your friends round the meeting room]]> 
     </copy> 
     <person><![CDATA[Jack]]> 
     </person> 
     <location><![CDATA[Lancaster]]> 
     </location> 
    </suggestion> 
</suggestions> 

這是我的JS:

window.addEvent('domready', function(){ 

    var outputHTML = ''; 

    var req = new Request({ 
     url: 'data.xml', 
     method: 'get', 
     onSuccess: function(responseText, responseXML) {     
      if(typeOf(responseXML) != 'document'){ 
       responseXML = responseXML.documentElement; 
      } 
      var suggestions = responseXML.getElements('suggestion'); 
      suggestions.each(function(item) { 
        outputHTML += '<p>'; 
        outputHTML += item.getElement('copy').get('text') + '<br/>'; 
        outputHTML += '<b>' + item.getElement('person').get('text') + '</b>: '; 
        outputHTML += item.getElement('location').get('text') + '<br/>';     
        if (item.get('winning') == 'Y') { 
         outputHTML += ' <b>Won!</b>'; 
        } 
        outputHTML += '</p>'; 
      }); 
      $('output').set('html', outputHTML); 
     } 
    }).send(); 

}); 

我發現我已經做responseXML = responseXML.documentElement位,使其在Chrome瀏覽器。這個JS在Chrome和FF中可以正常工作,但IE在第16行中抱怨「對象不支持此屬性或方法」,我試圖在responseXML上運行getElements('suggestion')。

任何善意的專家都可以恢復我對Mootools神祕能力的信心嗎?

乾杯 弗雷德

+0

也許你需要使用在這裏描述的「Microsoft.XMLDOM」ActiveX對象http://stackoverflow.com/questions/1601873/how-to-receive-xml-in-ie8-with-mootools – CodeZombie

+0

謝謝ZombieHunter,我注意到這個帖子,也認爲這是可能是我需要做的。同時我會看看是否有人有任何其他想法。對我來說似乎很奇怪,Mootools無法處理這個問題! –

回答

4

這是一個比較老的問題,但最近我有同樣的問題,所以我想分享我的解決方案。

您從Request收到的responseXML變量僅僅是瀏覽器未修改的XML響應。在IE(最高版本9)下,您將收到一個IXMLDOMDocument對象。我發現,這個對象轉換爲MooTools的Element樹的最簡單的方法是:

function(responseText, responseXML) { 
    var doc = responseXML.documentElement; 
    if (doc.xml) { 
     doc = new Element('div', { html: doc.xml }).getFirst(); 
    } 
    // Now you can use 'doc' like any other MooTools Element 
} 

或者,你可以使用IE的DOMParser這可能是更有效的:

function(responseText, responseXML) { 
    var doc = responseXML.documentElement; 
    if (doc.xml) { 
     var parser = new DOMParser(); 
     var html = parser.parseFromString(doc.xml, 'text/xml'); 
     doc = document.id(html.documentElement); 
    } 
    // Now you can use 'doc' like any other MooTools Element 
} 
+0

謝謝nwellnhof,我無法用我的原始代碼嘗試這個,但這似乎是對問題的實際答案。 –

0

在MooTools的鍛造有轉換XML爲JavaScript對象插件:

http://mootools.net/forge/p/xml2js_converter

+0

感謝Luwe,我會看看那個 - 這可能是一個更好的解決方案..看起來有點奇怪,使用Mootools我必須將XML轉換爲可以使用它。 –

+0

通常情況下,您需要對JSON字符串執行相同的操作,但是他們的核心腳本中包含這些字符串。與JSON相比,XML在解碼JS對象時更有問題。你真的必須使用XML嗎?在你的情況下,JSON不是更好的選擇嗎? – Luwe

+0

我明白了,謝謝Luwe。是的,不幸的是我必須在這種情況下使用XML。 –