XML - DOM API (Java Script) - help needed

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

XML - DOM API (Java Script) - help needed

Post by Sabina »

Просьба подсказать правильный метод, а то с учебным проектом зашиваюсь 8O. Сразу предупрежу, что JavaScript я вообще не знаю, а на весь DOM и SAX у нас всего была одна лекция. Так что прошу строго не судить.

Я пишу JavaScript функции для навигации по XML файлу.
Файл простой root-2ndGenChild->3rdGenChild.
Browse делаю по 2nd generation (всего 24 элемента) с отображением элементов 3rd generation в textfield/textarea вебстранички.

Загружается XML файл через следующий скрипт:

Code: Select all

<script>
 po = new ActiveXObject("Microsoft.XMLDOM")
 po.async = false
 po.load("project2.xml")
</script>


Потом мне нужно сделать функции для кнопок "First", "Prev" ,"Next" ,"Last".

Первый и последний написала так:

Code: Select all

function first()
 {
   root = po.documentElement 
   sndGenList = root.childNodes 
   sndGenNode = sndGenList.item(0) 
   thrdGenList = sndGenNode.childNodes 
   thrdGenNode1 = thrdGenList.item(1)
   thrdGenNode2 = thrdGenList.item(2) 
   thrdGenNode3 = thrdGenList.item(3)
   thrdGenNode5 = thrdGenList.item(5) 
   document.form1.NameArea.value = thrdGenNode1.text
   document.form1.ManufField.value = thrdGenNode2.text
   document.form1.DescArea.value = thrdGenNode3.text
   document.form1.refNumField.value = thrdGenNode5.text
   return false
 }

 function last()
 {
   root = po.documentElement 
   sndGenList = root.childNodes 
   sndGenNode = sndGenList.item(23) 
   thrdGenList = sndGenNode.childNodes 
   thrdGenNode1 = thrdGenList.item(1)
   thrdGenNode2 = thrdGenList.item(2) 
   thrdGenNode3 = thrdGenList.item(3)
   thrdGenNode5 = thrdGenList.item(5) 
   document.form1.NameArea.value = thrdGenNode1.text
   document.form1.ManufField.value = thrdGenNode2.text
   document.form1.DescArea.value = thrdGenNode3.text
   document.form1.refNumField.value = thrdGenNode5.text
   return false
 }



А вот с previous и next никак не соображу ( а время поджимает :( )
Вроде нужно пользоваться sndGenList.nextSibling
А как мне по данным в полях UI определить какой node current?

Если кто подскажет как тут быть, буду премного благодарна.

Сабина
User avatar
Katrin Andreyeff
Уже с Приветом
Posts: 7486
Joined: 19 Dec 2002 16:07

Re: XML - DOM API (Java Script) - help needed

Post by Katrin Andreyeff »

deleted
Исландия:
https://www.andreev.org/travel-story/iceland-travel-reykjavik.html
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Re: XML - DOM API (Java Script) - help needed

Post by IA72 »

Sabina wrote:Просьба подсказать правильный метод, а то с учебным проектом зашиваюсь 8O. Сразу предупрежу, что JavaScript я вообще не знаю, а на весь DOM и SAX у нас всего была одна лекция. Так что прошу строго не судить.

Я пишу JavaScript функции для навигации по XML файлу.
Файл простой root-2ndGenChild->3rdGenChild.
Browse делаю по 2nd generation (всего 24 элемента) с отображением элементов 3rd generation в textfield/textarea вебстранички.

Загружается XML файл через следующий скрипт:

Code: Select all

<script>
 po = new ActiveXObject("Microsoft.XMLDOM")
 po.async = false
 po.load("project2.xml")
</script>


Потом мне нужно сделать функции для кнопок "First", "Prev" ,"Next" ,"Last".

Первый и последний написала так:

Code: Select all

function first()
 {
   root = po.documentElement 
   sndGenList = root.childNodes 
   sndGenNode = sndGenList.item(0) 
   thrdGenList = sndGenNode.childNodes 
   thrdGenNode1 = thrdGenList.item(1)
   thrdGenNode2 = thrdGenList.item(2) 
   thrdGenNode3 = thrdGenList.item(3)
   thrdGenNode5 = thrdGenList.item(5) 
   document.form1.NameArea.value = thrdGenNode1.text
   document.form1.ManufField.value = thrdGenNode2.text
   document.form1.DescArea.value = thrdGenNode3.text
   document.form1.refNumField.value = thrdGenNode5.text
   return false
 }

 function last()
 {
   root = po.documentElement 
   sndGenList = root.childNodes 
   sndGenNode = sndGenList.item(23) 
   thrdGenList = sndGenNode.childNodes 
   thrdGenNode1 = thrdGenList.item(1)
   thrdGenNode2 = thrdGenList.item(2) 
   thrdGenNode3 = thrdGenList.item(3)
   thrdGenNode5 = thrdGenList.item(5) 
   document.form1.NameArea.value = thrdGenNode1.text
   document.form1.ManufField.value = thrdGenNode2.text
   document.form1.DescArea.value = thrdGenNode3.text
   document.form1.refNumField.value = thrdGenNode5.text
   return false
 }



А вот с previous и next никак не соображу ( а время поджимает :( )
Вроде нужно пользоваться sndGenList.nextSibling
А как мне по данным в полях UI определить какой node current?

Если кто подскажет как тут быть, буду премного благодарна.

Сабина


Во-первых, вместо sndGenList = root.childNodes; sndGenNode = sndGenList.item(0) правильнее использовать root.firstChild / lastChild, и не забыть проверить на hasChildNodes для начала (я вообще надеюсь, что это ты не рабочий код привела, да? :) ).
Получить по текущим полям node можно запросом, при условии, что комбинация их уникальна, иначе все развалится. Если в схеме есть id поле,
то смотри nodeFromID, если нет,
то генерировать xpath запрос для po.documentElement.selectSingleNode() по полям формы (если есть какое-то уникальное поле, но nodeFromID использовать не получается, то засунь его в hidden поле на форме).
Еще можно в том же hideen поле прятать текущий index из item коллекции, и брать +- от него. Я бы выбрал варианты в таком порядке
1) id
2) индекс
3) комбинация из детей
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: XML - DOM API (Java Script) - help needed

Post by Sabina »

IA72 wrote:Во-первых, вместо sndGenList = root.childNodes; sndGenNode = sndGenList.item(0) правильнее использовать root.firstChild / lastChild, и не забыть проверить на hasChildNodes для начала (я вообще надеюсь, что это ты не рабочий код привела, да? :) ).


Нет, не рабочий, учебный :) Сегодня был final exam по ХМЛ классу и проект, часть которого этот файл, нужно сдать сегодня до полуночи.

IA72 wrote:Я бы выбрал варианты в таком порядке
1) id
2) индекс
3) комбинация из детей


Я в итоге вон чего наваяла с переменными. Работает нормально, да и думать больше времени уже нет.

Code: Select all

<script>
  var m = 1
  var i = 1
  function first()
  {
    i = -1
    return next()
  }

  function last()
  {
    i = m
    return prev()
   }

  function next()
  {
    if (i < (m - 1)) i++;
    return show()
  }

 function prev()
 {
  if (i > 0) i--;
    return show()
  }

  function show()
  {
    var name = "" 
    var manuf = "" 
    var desc = "" 
    var rnum = "" 
    var nl = po.getElementsByTagName("product") 
    for (k = 0; k < nl.length; k++) 
    {
      if (k != i) continue; 
      var node = nl.item(k)
      var chl = node.childNodes 
      name = chl.item(1).text
      manuf = chl.item(2).text
      desc = chl.item(3).text
      rnum = chl.item(5).text
    }

    form1.NameArea.value = name 
    form1.ManufField.value = manuf 
    form1.DescArea.value = desc
    form1.refNumField.value = rnum 
    return false
  }


Это до загрузки странички. И потом соответственно

Code: Select all

<script for="window" event="onload">
 po = dso.XMLDocument
 m = po.getElementsByTagName("product").length 
 first()
</script>


и таг

Code: Select all

<xml id="dso" src="project2.xml"/>
в body.

Поглядим что препод скажет,
Сабина

Return to “Вопросы и новости IT”