2010-09-30 60 views
0

我用下面的解析器解析XMLXML的Javascript解析問題(具體代碼問題)

function parseXML(text) { 
    var doc; 

    if(window.DOMParser) { 
     var parser = new DOMParser(); 
     doc = parser.parseFromString(text, "text/xml"); 
    } 
    else if(window.ActiveXObject) { 
     doc = new ActiveXObject("Microsoft.XMLDOM"); 
     doc.async = "false"; 
     doc.loadXML(text); 
    } 
    else { 
     throw new Error("Cannot parse XML"); 
    } 

    return doc; 
} 

我不明白爲什麼它不在我的XML文檔,通過AJAX獲得工作。通過AJAX請求

結果:

X-Powered-By PHP/5.2.11 
Content-Length 887 
Keep-Alive timeout=5, max=95 
Connection Keep-Alive 
Content-Type text/xml 

<?xml version="1.0" encoding="UTF-8"?> 
<xml_test>wont work!</xml_test> 

測試代碼:

var xml = parseXML(data); 
    $(xml).find("xml_test").each(function() 
    { 
     console.info('found xml_test... never happen..'); 
    }); 

但如果我這樣使用它它很好地工作!

var data = '<xml_test>works</xml_test>'; 
    var xml = parseXML(data); 
    $(xml).find("xml_test").each(function() 
    { 
     alert('this works!'); 
    }); 

我知道,這是一個具體的問題,但我會感謝您的幫助和/或建議...

在此先感謝 佩德羅

+1

我的猜測是,你試圖通過已經被解析XML(如responseXML的文檔或東西)。你可以顯示初始化數據變量的代碼在這裏傳遞嗎? var xml = parseXML(data);每個(函數() console.info('found xml_test ... never happen ..'); }); – 2010-09-30 13:33:55

+0

也許這個問題與 有關doc = parser.parseFromString(text,「text/xml」); ?! – 2010-09-30 13:34:06

+0

謝爾蓋, $阿賈克斯({ 網址: '...' 類型: 'POST', 數據類型: 'XML', 數據:formulario.serialize(), 超時:15000, 成功:功能(data){.........} – 2010-09-30 13:38:13

回答

0

如果您使用jQuery(作爲測試代碼建議),你可以簡單地將xml傳遞給它。

var xml = $(data); 
+2

Hi難以捉摸,但我們不應該避免用jQuery解析xml? – 2010-09-30 13:36:48

+0

@Pedro Gil:由於jQuery經過廣泛的測試,我們可以肯定地解析XML,它使用一些技巧通過瀏覽器進行解析,而不是手動解析。我認爲這比自己解析它更好。 – jwueller 2010-09-30 13:46:43

+0

不,jQuery不解析XML。它使用'innerHTML'假裝它是HTML,這是不可靠的。請參閱http://stackoverflow.com/questions/2908899/jquery-wont-parse-xml-with-nodes-called-選項 – 2010-09-30 14:05:01

3

如果你使用jQuery來請求你的資源,你應該已經得到XML DOM文檔的情況下,它被送達文本/ xml的MIME類型。因此不需要解析。

1

我使用這個功能,並給了我很好的結果:

var myLoadXml = function(s){ 

    var objxml = null; 

    if(document.implementation && document.implementation.createDocument) { 

    var objDOMParser = new DOMParser(); 
    objxml = objDOMParser.parseFromString(s, "text/xml"); 

    } else if (window.ActiveXObject) { 

    objxml = new ActiveXObject('MSXML2.DOMDocument.3.0'); 
    objxml.async = false; 
    objxml.loadXML(s); 

    } 

    return objxml; 
}; 


var xml = myLoadXml(data); 

$(xml).find("xml_test").each(function() 
{ 
    console.info('found xml_test... never happen..'); 
}); 

編輯 Example

**編輯** II

function parseXML(text) { 
    var doc; 

    if (typeof text == 'object'){ // check type of text 
     return text; 
    } 

    if(window.DOMParser) { 
     var parser = new DOMParser(); 
     doc = parser.parseFromString(text, "text/xml"); 
    } 
    else if(window.ActiveXObject) { 
     doc = new ActiveXObject("Microsoft.XMLDOM"); 
     doc.async = "false"; 
     doc.loadXML(text); 
    } 
    else { 
     throw new Error("Cannot parse XML"); 
    } 

    return doc; 
} 
+0

這幾乎是OP已經做的事情。並且它不工作。 – 2010-09-30 14:07:55

+1

我做了一個例子。它的工作 – 2010-09-30 15:19:42

+0

是的,它應該肯定工作。我認爲它不適用於OP,因爲他將已分析的DOM傳遞給他的'parseXML'函數(這與您的'myLoadXml'函數相同)。 – 2010-09-30 17:09:04

1

如果你得到你的XML通過Ajax,不需要解析它,因爲瀏覽器會爲你做。只需使用XMLHttpRequest對象的responseXML屬性,它將爲您提供一個XML文檔對象。 jQuery的包裝此使用的dataType「XML」:

$.ajax({ 
    type: "GET", 
    url: "foo.xml", 
    dataType: "xml", 
    success: function(xml) { 
     alert(xml.documentElement.nodeName); 
    } 
});