2011-08-18 103 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。 –