Russian Qt Forum
Сентябрь 25, 2024, 06:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: js не корректно парсит xml  (Прочитано 9502 раз)
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 :
« Последнее редактирование: Июнь 23, 2012, 02:57 от Ubuntu_linux » Записан
Ubuntu_linux
Гость
« Ответ #1 : Июнь 23, 2012, 02:56 »

Тестирую в FireFox, а Опера  вообще ошибку відает:
Цитировать
Uncaught exception: TypeError: Cannot convert 'parseXml' to object
Записан
alexis031182
Гость
« Ответ #2 : Июнь 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.
Записан
mutineer
Гость
« Ответ #3 : Июнь 23, 2012, 10:50 »

Между xml-нодами многие парсеры видят пустые текстовые ноды
Записан
Ubuntu_linux
Гость
« Ответ #4 : Июнь 23, 2012, 12:43 »

Дело в том, что я не могу коректно прочитать файл запросом..... А если в DOMParser вставить просто строку с xml то все корректно отображается...
Почему так странно ведет себя XmlHttpRequest? (я читаю локальный файл, может в етом проблема?)
Записан
alexis031182
Гость
« Ответ #5 : Июнь 23, 2012, 13:04 »

Если локальный файл, то имя файла должно предваряться "file://filename" и успешным статусом будет 0:
Код
Javascript
if(request.status == 0) {}
вместо 200:
Код
Javascript
if(request.status == 200) {}
Записан
Ubuntu_linux
Гость
« Ответ #6 : Июнь 23, 2012, 17:59 »

Заработало!
Спасибо за помощь!

А как можно скрипт заставить работать в отдельном потоке? и выводить индикатор того, что скрипт работает?
Записан
alexis031182
Гость
« Ответ #7 : Июнь 23, 2012, 18:29 »

А как можно скрипт заставить работать в отдельном потоке? и выводить индикатор того, что скрипт работает?
Сам яваскрипт не поддерживает многопоточность. Можно конечно попробовать некоторые примочки, навроде этой, но каждая из них будет работать в окружении только своего типа браузера, причём версия его должна быть самая распоследняя.
Записан
Ubuntu_linux
Гость
« Ответ #8 : Июнь 23, 2012, 23:50 »

Хм, почему так сложно...
Записан
Ubuntu_linux
Гость
« Ответ #9 : Июль 14, 2012, 12:25 »

Возникла новая проблема, отображает кракозябры когда хмл  закодирована в windows-1251.
Почему так происходит?
Записан
alexis031182
Гость
« Ответ #10 : Июль 14, 2012, 13:11 »

В самом xml-файле именно эта кодировка выставлена в рутовском тэге?
Записан
Ubuntu_linux
Гость
« Ответ #11 : Июль 14, 2012, 13:20 »

да,

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

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

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


Но как бить, когда у меня может то windows-1251 то utf-8 ?  И почему вебкит не подхватил кодировку? (в мозиле все нормально)
Записан
alexis031182
Гость
« Ответ #12 : Июль 14, 2012, 13:33 »

Если загрузка XML идёт через аякс, то тот поддерживает только UTF-8. Мозилла наверное какую-то пост-обработку осуществляет.
Записан
Ubuntu_linux
Гость
« Ответ #13 : Июль 14, 2012, 13:43 »

А как узнать кодировку хмл с javascript?
Я читаю локальный файл!
Записан
alexis031182
Гость
« Ответ #14 : Июль 14, 2012, 20:15 »

...
Я читаю локальный файл!
Я сужу по предыдущим постам, где локальный файл открывался через аякс.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 21.