Получить элемент XML по индексу, а не по тегу - PullRequest
0 голосов
/ 01 февраля 2012

Я создаю библиотеку видео и разделил документ XML по категориям видео, например:

<video>
    <comedy>
        <url>bla</url>
        <title>blabla</title>
    </comedy>

    <action>
        <url>bla</url>
        <title>blabla</title>
    </action>
</video>

И так далее. Я использую XMLHttpRequest для getElementsByTagName () для нужного мне жанра, и он работает нормально.

Мой вопрос таков: я хочу создать категорию «Самые последние», которая бы просто выбрала первые 16 (или сколько угодно) в верхней части XML-файла, независимо от категории. Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Выполните итерации по дочерним узлам корневого элемента и проверьте, является ли узел элементом-узлом (childNodes также вернет textNodes для пробелов)

var doc=xml,//the xml-document
            childs=doc.documentElement.childNodes,
               i=-1,
               j=16;//how many nodes you like to get

    while(j && childs[++i])
    {
      if(childs[i].nodeType===1)//check if we got a element-node
      {
        j--;
        //do something with the element
        console.log(childs[i].tagName);
      }
    } 

В некоторых браузерах также может быть свойство children, которое возвращает только потомки, являющиеся узлами-элементами, но это не стандарт, поэтому я бы не советовал использовать его.

Когда вы используете библиотеку, такую ​​как jQuery, было бы гораздо проще получить тот же результат, который вам нужен:

$('>*:lt(16)',xml.documentElement)
  .each(function(i,o){console.log(o.tagName);});
0 голосов
/ 01 февраля 2012

Попробуйте так.

 xmlDoc.LoadXml(xml);

    XmlElement ele = xmlDoc.DocumentElement;

    if (ele.HasChildNodes)
    {
        for (int c = 0; c < ele.ChildNodes.Count; c++)
        {
            DisplayInfo(ele.ChildNodes[c]);
        }
    }


static void DisplayInfo(XmlNode node)
        {
            for (int a = 0; a < node.Attributes.Count; a++)
            {
                Console.WriteLine(node.Attributes[a].Name + " : " + node.Attributes[a].Value);
            }

            Console.WriteLine(node.Value);

            for (int c = 0; c < node.ChildNodes.Count; c++)
            {
                DisplayInfo(node.ChildNodes[c]);
            }
        }
...