Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: Ubuntu_linux от Июнь 23, 2012, 02:48



Название: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июнь 23, 2012, 02:48
Есть вот такой скрипт, но он не коректно парсит xml, не могу понять в чем причина, подскажите или покажите робочий код, пожалуйста.

Код
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item1>One</item1>
<item2>Two</item2>
<item3>Three</item3>
</root>

Код
Javascript
    <script type="text/javascript">
function loadFileToElement(filename)
{
var parseXml;
 
   //var xmlDoc=document.implementation.createDocument("","",null);
 
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", filename, false);
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.send();
 
 
 
if(xmlhttp.readyState == 4 )
     {
parseXml=xmlhttp.responseXML.documentElement;
 
for(var i=0; i<parseXml.childNodes.length;i++){
document.getElementsByTagName("p")[0].innerHTML+="<p>"+parseXml.childNodes.length+" : "+i+" : "+parseXml.childNodes[i].tagName+" : "+parseXml.childNodes[i].textContent
}//for
 
 
   }//if
}//if
 
</script>

А результат етого скрипта какой-то странный:
Цитировать
7 : 0 : undefined :

7 : 1 : item1 : One

7 : 2 : undefined :

7 : 3 : item2 : Two

7 : 4 : undefined :

7 : 5 : item3 : Three

7 : 6 : undefined :


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июнь 23, 2012, 02:56
Тестирую в FireFox, а Опера  вообще ошибку відает:
Цитировать
Uncaught exception: TypeError: Cannot convert 'parseXml' to object


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июнь 23, 2012, 10:35
Может быть так
Код
Javascript
var request = false;
 
function readyRead() {
  if(request.readyState == 4) {
     if(request.status == 200) {
        try {
           xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           xmlDoc.async = "false";
           xmlDoc.loadXML(request.responseText);
        } catch(e) {
           try {
              parser = new DOMParser();
              xmlDoc = parser.parseFromString(request.responseText, "text/xml");
           } catch(e) {alert(e.message)}
        }
 
        var cells = xmlDoc.getElementsByTagName("flooring");
        for(var i = 0; i < cells.length; i++) {...}
     }
  }
}
 
try {request = new XMLHttpRequest();}
catch(e) {
  try {request = new ActiveXObject("Msxml2.XMLHTTP");}
  catch(e) {
     try {request = new ActiveXObject("Microsoft.XMLHTTP");}
     catch(failed) {request = false;}
  }
}
if(!request) alert("Ошибка инициализации XMLHttpRequest!");
 
request.open("GET", filename, true);
request.onreadystatechange = readyRead();
request.send();
 

Не мучайте себя. Используйте для ajax'а jquery.


Название: Re: js не корректно парсит xml
Отправлено: mutineer от Июнь 23, 2012, 10:50
Между xml-нодами многие парсеры видят пустые текстовые ноды


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июнь 23, 2012, 12:43
Дело в том, что я не могу коректно прочитать файл запросом..... А если в DOMParser вставить просто строку с xml то все корректно отображается...
Почему так странно ведет себя XmlHttpRequest? (я читаю локальный файл, может в етом проблема?)


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июнь 23, 2012, 13:04
Если локальный файл, то имя файла должно предваряться "file://filename" и успешным статусом будет 0:
Код
Javascript
if(request.status == 0) {}
вместо 200:
Код
Javascript
if(request.status == 200) {}


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июнь 23, 2012, 17:59
Заработало!
Спасибо за помощь!

А как можно скрипт заставить работать в отдельном потоке? и выводить индикатор того, что скрипт работает?


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июнь 23, 2012, 18:29
А как можно скрипт заставить работать в отдельном потоке? и выводить индикатор того, что скрипт работает?
Сам яваскрипт не поддерживает многопоточность. Можно конечно попробовать некоторые примочки, навроде этой (https://developer.mozilla.org/En/Using_web_workers), но каждая из них будет работать в окружении только своего типа браузера, причём версия его должна быть самая распоследняя.


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июнь 23, 2012, 23:50
Хм, почему так сложно...


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июль 14, 2012, 12:25
Возникла новая проблема, отображает кракозябры когда хмл  закодирована в windows-1251.
Почему так происходит?


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июль 14, 2012, 13:11
В самом xml-файле именно эта кодировка выставлена в рутовском тэге?


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июль 14, 2012, 13:20
да,

Код
XML
<?xml version="1.0" encoding="windows-1251"?>

Помогло, когда указал 

Код
Javascript
xmlhttp.overrideMimeType('text/xml;charset=windows-1251');


Но как бить, когда у меня может то windows-1251 то utf-8 ?  И почему вебкит не подхватил кодировку? (в мозиле все нормально)


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июль 14, 2012, 13:33
Если загрузка XML идёт через аякс, то тот поддерживает только UTF-8. Мозилла наверное какую-то пост-обработку осуществляет.


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июль 14, 2012, 13:43
А как узнать кодировку хмл с javascript?
Я читаю локальный файл!


Название: Re: js не корректно парсит xml
Отправлено: alexis031182 от Июль 14, 2012, 20:15
...
Я читаю локальный файл!
Я сужу по предыдущим постам, где локальный файл открывался через аякс.


Название: Re: js не корректно парсит xml
Отправлено: Ubuntu_linux от Июль 15, 2012, 10:29
Но вссетаки, как узнать кодировку?