Почему я не могу разобрать XML в JavaScript? - PullRequest
0 голосов
/ 19 января 2011

привет, у меня есть проблема, чтобы разобрать XML .. У меня есть XML как это:

<tejemahan>
  <kategori> komputer </kategori>
  <hasil> aplikasi komputer </hasil>
</terjemahan>

Отредактировано: XML выше я получаю таким образом:

   var url="http://localhost:8080/inlinetrans/api/translate/"+userSelection+"/"+hasilStemSel+"/"+hasilStem;
   var client = new XMLHttpRequest();
   client.open("GET", url, false);
   client.setRequestHeader("Content-Type", "text/plain");
   client.send(null);

   if(client.status == 200)
       alert("the request success"+client.responseText);
   else
       alert("the request isn't success"+client.status+""+client.statusText)

  }

и это мой код для разбора XML-файла выше:

this.loadXML = function (){
   var url = http://localhost:8080/coba/api/artikan/"+sel+"/"+hasilStemSel+"/"+hasilStem
   xmlDoc=document.implementation.createDocument("","",null);
   xmlDoc.load("url");
   xmlDoc.onload= this.readXML;
  }

  this.readXML = function() {
        alert(xmlDoc.documentElement.tagName);
 alert(xmlDoc.documentElement.childNodes[0].tagName);
 alert(xmlDoc.documentElement.childNodes[1].tagName);
 alert(xmlDoc.documentElement.childNodes[0].textContent);
 alert(xmlDoc.documentElement.childNodes[1].textContent);

     }

я могу выполнить этот код

xmlDoc=document.implementation.createDocument("","",null); 
xmlDoc.load("url");

но почему я не могу выполнить этот код xmlDoc.load = this.readXML ???

Ответы [ 2 ]

1 голос
/ 19 января 2011

Во-первых, я поддерживаю предложение Дэвида Дорварда: используйте взамен XMLHttpRequest, который будет работать во всех основных браузерах. Код ниже.

Во-вторых, ваша функция readXML имеет недостатки, так как большинство браузеров включают текстовые узлы в виде пробелов в коллекции childNodes, поэтому xmlDoc.documentElement.childNodes[0] фактически будет текстовым узлом и не будет иметь свойства tagName. Я бы предложил использовать getElementsByTagName() или проверить свойство nodeType каждого узла, когда вы перебираете childNodes.

В-третьих, ваш XML недействителен: <tejemahan> и </terjemahan> не совпадают, хотя это может быть опечаткой в ​​вашем вопросе.

var url = "http://localhost:8080/coba/api/artikan/"+sel+"/"+hasilStemSel+"/"+hasilStem;

var readXML = function(xmlDoc) {
    alert(xmlDoc.documentElement.tagName);
    var kategori = xmlDoc.getElementsByTagName("kategori")[0];
    alert(kategori.tagName);
};

var createXmlHttpRequest = (function() {
    var factories = [
        function() { return new XMLHttpRequest(); },
        function() { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); },
        function() { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); },
        function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
    ];

    for (var i = 0, len = factories.length; i < len; ++i) {
        try {
            if ( factories[i]() ) {
                return factories[i];
            }
        }
        catch (e) {}
    }
})();

var xmlHttp = createXmlHttpRequest();
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
        readXML(xmlHttp.responseXML);
    }
};

xmlHttp.open("GET", url, true);
xmlHttp.send(null);
1 голос
/ 19 января 2011

Попробуйте поместить назначение обработчика загрузки перед вызовом load (). Если вы сначала вызовете load (), событие onload произойдет до того, как вы назначите обработчик для его обработки. Как это:

xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.onload= this.readXML;
xmlDoc.load("url");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...