XML - есть SingleNode как узнать его child index у родителя

User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

XML - есть SingleNode как узнать его child index у родителя

Post by AnyaGal »

Есть xml document с похожей структурой:
<contacts>
<contact>
<field1>Value1_1</field1>
<field2>Value2_1</field2>
<field2>Value3_1</field2>
</contact>
<contact>
<field1>Value1_2</field1>
<field2>Value2_2</field2>
<field2>Value3_2</field2>
</contact>
<contact>
<field1>Value1_3</field1>
<field2>Value2_3</field2>
<field2>Value3_3</field2>
</contact>
</contacts>

Допустим используя XPath:

myNode=myDocument.SelectSingleNode(/contacts/contact[field2='Value2_2'])

То есть в myNode сейчас находится 2-й по порядку node <contact>.

Можно ли мне как-нибудь докопаться до информации, что он именно второй по порядку у родителя (<contacts>) из myNode без дополнительных поисков по myDocument? Никакого id у этого node нет и не будет.
User avatar
vlad12345
Уже с Приветом
Posts: 605
Joined: 14 Feb 2002 10:01
Location: Russia

Post by vlad12345 »

Что-то типа

Code: Select all

myNode.selectNodes("preceding-sibling::*").length + 1

Это будет порядковый номер myNode среди прочих элементов у их общего родителя.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

Хорошо другой вопрос, ответ на который может избавить от ответа на первый. :)

Можно ли как-нибудь сделать поиск по xml case insensetive?
Мне нужно по значению трех полей из <contact> добыть остальные.

По типу если вы забыли свой username и password, введите свой e-маил и пр. проверочные поля и остальное мы вам вышлем по e-mail.

Проблема в том что все это может быть как в Upper case так и в lower case, так что поиск мне надо сделать case insensitive, а вернуть значения с сохранением регистров.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

vlad12345 wrote:Что-то типа

Code: Select all

myNode.selectNodes("preceding-sibling::*").length + 1

Это будет порядковый номер myNode среди прочих элементов у их общего родителя.


Спасибо! Попробую. :)

Я просто решила сделать копию xml и перевести ее в lower case, по трем полям найти нужный node, запомнить его порядковый номер и из оригинального xml с учетом регистров взять нужные поля по порядковому номеру.

Если как-нибудь можно делать поиск без учета регистра то тогда такой путь конечно extra step.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: XML - есть SingleNode как узнать его child index у родителя

Post by Sabina »

AnyaGal wrote:...Можно ли мне как-нибудь докопаться до информации, что он именно второй по порядку у родителя (<contacts>) из myNode без дополнительных поисков по myDocument? Никакого id у этого node нет и не будет.


Аня,

Я не совсем с ответом, но вот подумала может вам пригодиться.
http://www.mousetrap.net/syllabus/xml/day4.html

Когда я в свое время делала browse, search и directory XML файла, пользовалась сделующим кодом:

search:

Code: Select all

<script>
 function x()
 {
   n = document.form1.SearchText.value
   root = po.documentElement 
   sndGenList = root.childNodes 
   sndGenNode = sndGenList.item(n-1) 
   thrdGenList = sndGenNode.childNodes 
   thrdGenNode1 = thrdGenList.item(1)
   thrdGenNode5 = thrdGenList.item(5) 
   document.form1.textArea.value = thrdGenNode1.text
   document.form1.refNumField.value = thrdGenNode5.text
   return false
 }

 function clear()
 {
   document.form1.SearchText.value= ""
   document.form1.textArea.value = ""
   document.form1.refNumField.value = ""
 }


</script>



browse:

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
  }

</script>


directory:

Code: Select all

<script>
  function show()   
  {
   root = po.documentElement 
   sndGenList = root.childNodes
   var a_line="";
   var loop = 0;
   while (loop < 24)
   {
     sndGenNode = sndGenList.item(loop) 
     thrdGenList = sndGenNode.childNodes 
     thrdGenNode = thrdGenList.item(1)
     a_line = a_line + thrdGenNode.text + "\n"
     loop=loop+1
   }
   document.form1.textArea.value = a_line
   return false
  }
</script>


Если это чем-то поможет, могу выслать весь проект вместе с XML файлом на емыл.

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

Re: XML - есть SingleNode как узнать его child index у родителя

Post by Sabina »

насчет case sensitive. А нельзя использовать case-insensitive parser?

Сабина
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Re: XML - есть SingleNode как узнать его child index у родителя

Post by AnyaGal »

Sabina wrote:насчет case sensitive. А нельзя использовать case-insensitive parser?

Сабина


Я не знаю - я использую встроенный в .NET.

Может он уже case insensetive stal, но раньше по-моему был case sensetive.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Re: XML - есть SingleNode как узнать его child index у родителя

Post by AnyaGal »

Sabina wrote:Если это чем-то поможет, могу выслать весь проект вместе с XML файлом на емыл.


Спасибо, но наверное не надо. :)
У меня с навигацией и поиску по xml проблем вроде нет, я уже давно xml использую, просто иногда случается ступор.
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: XML - есть SingleNode как узнать его child index у родителя

Post by testuser »

Sabina wrote:насчет case sensitive. А нельзя использовать case-insensitive parser?

Сабина


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

Re: XML - есть SingleNode как узнать его child index у родителя

Post by Sabina »

testuser wrote:
Sabina wrote:насчет case sensitive. А нельзя использовать case-insensitive parser?

Сабина


No, XML is case sensitive! :umnik1:


То есть прогнать xml файл, например через microdom не получиться?

....Because of these departures from the XML standards, the parsers used by most DOM implementations will choke on valid HTML. microdom, by default, parses in case-insensitive mode, allowing it to parse HTML that has non-matching cases on tags.


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

Re: XML - есть SingleNode как узнать его child index у родителя

Post by Sabina »

AnyaGal wrote:У меня с навигацией и поиску по xml проблем вроде нет, я уже давно xml использую, просто иногда случается ступор.


У меня тоже ступоры случаются и нередко :( . И всегда так приятно, когда приветовские мужчины приходят на помощь :wink:

Сабина
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Re: XML - есть SingleNode как узнать его child index у родителя

Post by AnyaGal »

Sabina wrote:И всегда так приятно, когда приветовские мужчины приходят на помощь :wink:



Это точно.

Очень мне нравится мне раздел "Вопросы IT". :)
"Автомобили" тоже ничего. 8)
Главное в "Жизни" и "Политике" не сильно выступать.
User avatar
AnyaGal
Уже с Приветом
Posts: 5771
Joined: 02 Dec 1999 10:01
Location: Saint-Petersburg --> Bellevue, WA

Post by AnyaGal »

vlad12345 wrote:Что-то типа

Code: Select all

myNode.selectNodes("preceding-sibling::*").length + 1

Это будет порядковый номер myNode среди прочих элементов у их общего родителя.


Еще раз спасибо! Работает! :)
User avatar
JustMax
Уже с Приветом
Posts: 1476
Joined: 05 Dec 2000 10:01
Location: Vilnius -> Bonn

Re: XML - есть SingleNode как узнать его child index у родит

Post by JustMax »

Sabina wrote:
AnyaGal wrote:У меня с навигацией и поиску по xml проблем вроде нет, я уже давно xml использую, просто иногда случается ступор.


У меня тоже ступоры случаются и нередко :( . И всегда так приятно, когда приветовские мужчины приходят на помощь :wink:

Сабина


А почему ваши аватары пропали куда-то ? Прям сейчас только понял, что это же та самая Сабина! :)

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