2009-12-29 2 views
0

Я пытаюсь разобрать xml, исходящий из XMLHttpRequest (для расширения Firefox). В следующем коде req является объектом XMLHttpRequest. Я сделал req.overrideMimeType("text/xml"); после объявления req.XML-анализ в Javascript

var shortURL; 
var xmlDoc = document.implementation.createDocument("","",null); 
xmlDoc.async = false; 
xmlDoc = req.responseXml; 
if (xmlDoc.readyState == 4){ 
    shortURL = xmlDoc.documentElement.childNodes[8].text; 
} 

Если я использую req.responseXml я получаю сообщение об ошибке сказав «xmlDoc не объявлен» на линии после xmlDoc = req.responseXml; Если я использую req.responseText, xmlDoc.readyState == 4 оказывается ложным.

Я не занимаюсь большей частью javascript, поэтому, пожалуйста, скажите мне, что я делаю что-то неправильно здесь.

+0

'xmlDoc.readyState' не имеет смысла, потому что' xmlDoc' является XML * document * не XMLHttpRequest. – MatrixFrog

ответ

0

Хай chanux,

Может это поможет вам знать basics of xml parser

http://www.hiteshagrawal.com/javascript/javascript-parsing-xml-in-javascript

AJAX responseXML errors

или попробуйте изменить

shortURL = xmlDoc.documentElement.childNodes[8].Text; 

к

shortURL = xmlDoc.documentElement.childNodes[8].firstChild.nodeValue; 

или использовать эту функцию и изменить его на ваш ...

function parseXML() 
    { 
     if (xmlDoc.readyState == 4 && xmlDoc.status == 200) 
     { 
       xmlDoc = xmlDoc.responseXML; 
       regions = xmlDoc.getElementsByTagName("region"); 
       for (var i = 0; i < regions.length; i++) 
       { 
        if (regions[i].getAttribute("id") == regID) 
        { 
         var browserName = navigator.userAgent; 
         var isIE = browserName.match(/MSIE/); 
         if (isIE) 
         { 
          var hotelprice = regions[i].childNodes[0].firstChild.nodeValue; 
          var pkgprice = regions[i].childNodes[1].firstChild.nodeValue; 

         } 
         else 
         { 
          var hotelprice = regions[i].childNodes[1].textContent; 
          var pkgprice = regions[i].childNodes[3].textContent; 
         } 
         document.getElementById("hotel").innerHTML = "$"+hotelprice; 
         document.getElementById("package").innerHTML = "$"+pkgprice; 
        } 
       } 
     } 
    } 
1

Я вообще предпочитаю использовать responseText, а затем разбор XML с помощью браузера встроенного в XML разборе библиотеки. После этого я обычно конвертирую результирующее дерево документов XML или вспомогательное дерево в JSON для легкого доступа к JavaScript.

я написал маленькую утилиту библиотеку для этого здесь:

http://earth-api-samples.googlecode.com/svn/trunk/demos/myearth/lib/xmlutil.js

Использование довольно прост:

var json = xmlNodeToJson(parseXml(req.responseText); 
+0

+1 Это имеет для меня больше всего смысла –

+1

Я могу получить прямой ответ JSON с сервера. Итак, я использую формат JSON. Thanx. – chanux

0

вам нужно использовать DOM ли? Если нет, используйте E4X. Это так просто, как

shortURL = new XML(req.responseText).child(8).text(); 

Если ответ включает в себя декларацию XML (<?xml version="...">), используйте вместо этого:

shortURL = new XML(req.responseText.replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, "")).child(8).text(); 
Смежные вопросы