Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.07.2009, 19:30
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

Как сделать разбор xml-документа и создание нового списка?
Делаю форму, в которой при выборе города подгружаются районы для данного города.
У меня список районов (и их номеров) выводится в виде XML-документа (этот xml-документ создаётся с помощью php):
<?xml version="1.0" encoding="windows-1251"?>
<raions><rv>1</rv><rn>Железнодорожный</rn><rv>2</rv><rn>Ленинский</rn></raions>

Здесь в тегах <rv> содержатся номера районов (без номеров никуда, по ним происходит идентификация каждого района), а в <rn> - названия районов.

Перед отправкой браузеру этого XML-документа ставлю заголовок:
header("Content-Type: text/xml; charset=windows-1251");

Не привожу саму функцию с XMLHttpReques-объектом, так как здесь у меня проблем не возникает. Не знаю, как написать функцию inHTML(), в задачу которой входит отобразить список с районами.

if (xmlhttp.readyState==4)
{
inHTML();
}

В качестве responseText я без проблем могу увидеть данные, полученные от сервера (вижу xml-документ). Но мне надо из данных составить новый список из районов следующего вида (для каждого города названия и количество районов будут отличаться):
<select>
<option value="1">Железнодорожный</option>
<option value="2">Ленинский</option>
</select>

Может кто знает, как грамотно сделать такую вещь?

Здесь следует использовать свойство responseXML объекта XMLHttpRequest, а вот как его использовать мне не понятно.

Как сделать функцию, производящую разбор xml-документа? Может следует изменить структуру xml-документа? Конечно же можно было бы прямо на сервере составить данный список со всеми html-тегами, отправить его браузеру и в браузере вставить с помощью innerHTML, но innerHTML не поддерживается стандартом w3c, а значит использовать его всётаки не рекомендуется.

Последний раз редактировалось uonax, 13.07.2009 в 19:34.
Ответить с цитированием
  #2 (permalink)  
Старый 14.07.2009, 12:14
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Когда вы получаете ответ с сервера и забираете его как responseXML, вы получаете documentFragment, т.е. это как бы новый полноценный документ. Парсить его нужно соответственно. Например, вы сохранили ответ:
var xmlDoc=ajax.responseXML

Теперь останется только написать цикл, который будет пробегать по вашему xmlDoc и выбирать нужные значения, начиная от корня документа:
var childs=xmlDoc.documentElement.childNodes;
var options=new Array();
for(var i=0; i<childs.length; i++){
  if(!childs[i].tagName) continue;
  if(childs[i].tagName=='RV') var index=childs[i].firstChild.nodeValue;
  else if(childs[i].tagName=='RN') options[index]=childs[i].firstChild.nodeValue;
}

Всё написано на скорую руку...
Адаптировано под ваш XML. На выходе получим массив, содержащий название района, ассоциированое с его индексом.

Думаю, имея такой массив, вам не составит труда создать список.
Ответить с цитированием
  #3 (permalink)  
Старый 14.07.2009, 12:22
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

PS: Структуру xml нужно поменять, примерно так:
<?xml version="1.0" encoding="windows-1251"?>
<raions>
  <rn rv="1">Железнодорожный</rn>
  <rn rv="2">Ленинский</rn>
</raions>

Он станет полегче и логически правельнее. Но это лично моё мнение.
Ответить с цитированием
  #4 (permalink)  
Старый 15.07.2009, 07:59
Аспирант
Отправить личное сообщение для gosha_kap Посмотреть профиль Найти все сообщения от gosha_kap
 
Регистрация: 03.07.2009
Сообщений: 41

а если это делать через XSLT процессор ??? тоже вариант
Ответить с цитированием
  #5 (permalink)  
Старый 15.07.2009, 09:44
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от gosha_kap
а если это делать через XSLT процессор ??? тоже вариант
Да, это хороший вариант, НО:
1. Создаётся дополнительный запрос к серверу, а это не есть гуд.
2. Полученный XHTML должен как-то окупать вес XML и XSL + запрос, т.е. XSL должен генерировать больше XHTML, а это означает, что структура XML должна быть сложнее.

Думаю, в вашем случае для такого простого XML создавать дополнительный XSL не стоит. Если изменить ваш XML так, как я предложил, мы получим меньший XML и JS-код для его парсинга. Код для генерирования списка так же уместиться в 3 строки.
Ответить с цитированием
  #6 (permalink)  
Старый 15.07.2009, 15:59
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

Сообщение от gosha_kap Посмотреть сообщение
а если это делать через XSLT процессор ??? тоже вариант
А это зачем? Это же таблица стилей для xml. Здесь это ни к чему.
Ответить с цитированием
  #7 (permalink)  
Старый 15.07.2009, 23:24
_69
 
Сообщений: n/a

Сообщение от B~Vladi Посмотреть сообщение
var childs=xmlDoc.documentElement.childNodes;
var options=new Array();
for(var i=0; i<childs.length; i++){
  if(!childs[i].tagName) continue;
  if(childs[i].tagName=='RV') var index=childs[i].firstChild.nodeValue;
  else if(childs[i].tagName=='RN') options[index]=childs[i].firstChild.nodeValue;
}
В некоторых типах веб-браузеров первыйРебенок - проблельный
Ответить с цитированием
  #8 (permalink)  
Старый 16.07.2009, 11:56
Аспирант
Отправить личное сообщение для gosha_kap Посмотреть профиль Найти все сообщения от gosha_kap
 
Регистрация: 03.07.2009
Сообщений: 41

ни к чему... я просто мысли мыслю
Ответить с цитированием
  #9 (permalink)  
Старый 16.07.2009, 15:10
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от _69
В некоторых типах веб-браузеров первыйРебенок - проблельный
В этом случае не проблемный. Здесь мы обращаемся к текстовой ноде, которая может быть только одна.
Ответить с цитированием
  #10 (permalink)  
Старый 16.07.2009, 15:48
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

Довожу до вашего сведения, что ваш написанный на скорую руку код не работает... В ie сразу после выбора города вылазит ошибка, т.е. полагаю, что надо парсить более аккуратно и предусмотреть вариант, когда получаемый xml-документ:
а) ничего не содержит
б) содержит другую структуру документа.

Пока удалось решить часть вопроса по-своему.
Вот xml-документ, посылаемый брузеру:
<?xml version="1.0" encoding="windows-1251"?><raions><rn1>Железнодорожный</rn1><rn2>Ленинский</rn2></raions>

Удалось отобразить один произвольный элемент из этого документа с помощью getElementsByTagName(). Другие методы типа getElementsByName() здесь не сработали, хотя во многих книгах я видел описание именно такого метода, правда не для xml-документов %).

Вот код, который позволяет вывести на страницу значение пока только одного элемента:
if (xmlDoc.readyState==4) 
{
if (xmlDoc.responseXML.getElementsByTagName('rn1')[0])
{
inHTML(xmlDoc.responseXML.getElementsByTagName('rn1')[0].childNodes[0].nodeValue);
}
}

где inHTML - функция, выводящая что-то в браузер.
Пока это единственный способ, котрый работает. Далее можно улучшить код, сделать "пробежку" по всем элементам и т.д.

Мне интересно, а как можно парсить xml-документ такого вида:
<?xml version="1.0" encoding="windows-1251"?>
<raions>
<rn rv="1">Железнодорожный</rn>
<rn rv="2">Ленинский</rn>
</raions>

Здесь есть атрибуты, а как к ним обращаться я не знаю. Может кто подскажет?
И ещё не понял, что делают documentElement и documentFragment. В каких случаях их применять и что они возвращают?

Последний раз редактировалось uonax, 16.07.2009 в 15:54.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45
Вопрос как сделать эту панельку Определённых размеров и свойств. jei jQuery 3 09.06.2009 19:14
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24
Как узнать какие ошибки произошли при парсинге xml файла faunder Events/DOM/Window 0 12.09.2008 14:17