Приложите несколько NodeLists на Яве

Я пытался в течение многих часов приложить три NodeLists и провал. Можно ли, пожалуйста, помочь мне?

Я сделал следующий код:

NodeList nList = root.getElementsByTagName("res");
NodeList nList2 = root.getElementsByTagName("agr");
NodeList nList3 = root.getElementsByTagName("rag");

NodeList allNodes = appendNodeLists(nList, nList2, nList3);

и appendNodeLists метод:

   public static NodeList appendNodeLists(NodeList a, NodeList b, NodeList c)
   {
     NodeList nList;
       int aSize = a.getLength();
       int bSize = b.getLength();
       int cSize = c.getLength();
       if(aSize>0)
       {
           for (int i = 0; i < aSize; i++) 
               nList.item(i) = a.item(i);  //Error in this line
       }
       if(bSize>0)
       {
           for (int i = 0; i < bSize; i++) 
               nList.item(aSize+1+i) = b.item(i); //Error in this line                    
       }
       if(cSize>0)
       {
           for (int i = 0; i < bSize; i++)
               nList.item(aSize+bSize+1+i) = c.item(i);  //Error in this line            
       }

       return nList;
   }

Что я делаю неправильно? Я не могу приложить 3 NodeLists, и я, может казаться, не выясняю почему.

Btw, у меня есть та же самая ошибка в 3 линиях: "Неожиданный тип - необходимая переменная - найденный стоимостью". Почему это происходит?

1
I' ve, замеченный это. I' ve удалось заставить его работать. Спасибо так или иначе
добавлено автор SaintLike, источник

10 ответы

Одна проблема то, что:

nList.item(i)

получает стоимость, где, поскольку она похожа, вы пытаетесь установить значение к ней. Вы не можете поручить ничему nList.item (i) . Сам интерфейс NodeList не начинает операции для добавления новых пунктов в список. Вы могли бы хотеть посмотреть на основной тип NodeList и видеть, можно ли добавить пункты к этому. Кроме того, вы не строите nList переменная. NodeList является интерфейсом. Что вы собирались создать это как?

If you don't want that as a NodeList, you could very easily do it as a regular List instead. Something like this:

   List nodes = new ArrayList();
   int aSize = a.getLength();
   int bSize = b.getLength();
   int cSize = c.getLength();
   if(aSize>0)
   {
       for (int i = 0; i < aSize; i++) 
           nodes.add(a.item(i));
   }
   ...
2
добавлено
Спасибо. Я думаю я can' t получают подэлементы от узла если they' ре в нормальном ArrayList. Есть ли способ сделать это?
добавлено автор SaintLike, источник
Хорошо, спасибо. it' s работа:)
добавлено автор SaintLike, источник
Уверенный вы можете. Узлом является все еще Узел независимо от какой структура данных то, что это было сохраненным в ( NodeList против регулярного Список ). Дайте ему выстрел и отправьте назад, если вы сталкиваетесь с проблемами.
добавлено автор cmbaxter, источник

Одна проблема то, что:

nList.item(i)

получает стоимость, где, поскольку она похожа, вы пытаетесь установить значение к ней. Вы не можете поручить ничему nList.item (i) . Сам интерфейс NodeList не начинает операции для добавления новых пунктов в список. Вы могли бы хотеть посмотреть на основной тип NodeList и видеть, можно ли добавить пункты к этому. Кроме того, вы не строите nList переменная. NodeList является интерфейсом. Что вы собирались создать это как?

If you don't want that as a NodeList, you could very easily do it as a regular List instead. Something like this:

   List nodes = new ArrayList();
   int aSize = a.getLength();
   int bSize = b.getLength();
   int cSize = c.getLength();
   if(aSize>0)
   {
       for (int i = 0; i < aSize; i++) 
           nodes.add(a.item(i));
   }
   ...
2
добавлено
Спасибо. Я думаю я can' t получают подэлементы от узла если they' ре в нормальном ArrayList. Есть ли способ сделать это?
добавлено автор SaintLike, источник
Хорошо, спасибо. it' s работа:)
добавлено автор SaintLike, источник
Уверенный вы можете. Узлом является все еще Узел независимо от какой структура данных то, что это было сохраненным в ( NodeList против регулярного Список ). Дайте ему выстрел и отправьте назад, если вы сталкиваетесь с проблемами.
добавлено автор cmbaxter, источник

С тех пор NodeList не выставляет методов, чтобы видоизменить его государство, можно осуществить собственную версию, чтобы связать списки:

  public static NodeList join(final NodeList... lists) {
    class JoinedNodeList implements NodeList {
      @Override
      public int getLength() {
        int len = 0;
        for (NodeList list : lists) {
          len += list.getLength();
        }
        return len;
      }

      @Override
      public Node item(int index) {
        for (NodeList list : lists) {
          if (list.getLength() > index) {
            return list.item(index);
          } else {
            index -= list.getLength();
          }
        }
        return null;
      }
    }

    return new JoinedNodeList();
  }
0
добавлено

С тех пор NodeList не выставляет методов, чтобы видоизменить его государство, можно осуществить собственную версию, чтобы связать списки:

  public static NodeList join(final NodeList... lists) {
    class JoinedNodeList implements NodeList {
      @Override
      public int getLength() {
        int len = 0;
        for (NodeList list : lists) {
          len += list.getLength();
        }
        return len;
      }

      @Override
      public Node item(int index) {
        for (NodeList list : lists) {
          if (list.getLength() > index) {
            return list.item(index);
          } else {
            index -= list.getLength();
          }
        }
        return null;
      }
    }

    return new JoinedNodeList();
  }
0
добавлено

NodeList by itself is pretty basic and is used just to iterate over the Nodes. To create a new NodeList use an Element after passing the root Document object to your method as follows.

public static NodeList appendNodeLists(Document root,
                                       NodeList a, NodeList b, NodeList c)
{
    Element allNodes = root.createElement("allNodes");

    for (int i = 0; i < a.getLength(); i++)
        allNodes.appendChild(a.item(i));

    for (int i = 0; i < b.getLength(); i++) 
        allNodes.appendChild(b.item(i));

    for (int i = 0; i < c.getLength(); i++)
        allNodes.appendChild(c.item(i));

    return allNodes.getChildNodes();
}
0
добавлено

NodeList by itself is pretty basic and is used just to iterate over the Nodes. To create a new NodeList use an Element after passing the root Document object to your method as follows.

public static NodeList appendNodeLists(Document root,
                                       NodeList a, NodeList b, NodeList c)
{
    Element allNodes = root.createElement("allNodes");

    for (int i = 0; i < a.getLength(); i++)
        allNodes.appendChild(a.item(i));

    for (int i = 0; i < b.getLength(); i++) 
        allNodes.appendChild(b.item(i));

    for (int i = 0; i < c.getLength(); i++)
        allNodes.appendChild(c.item(i));

    return allNodes.getChildNodes();
}
0
добавлено

Если вы действительно хотите использовать NodeList, можно сделать это:

nList.item(i).setNodeValue(a.item(i).getNodeValue());

Лучший способ сделать это только со Списком как cmbaxter предложен, все же.

List nodes = new ArrayList();
0
добавлено

Если вы действительно хотите использовать NodeList, можно сделать это:

nList.item(i).setNodeValue(a.item(i).getNodeValue());

Лучший способ сделать это только со Списком как cmbaxter предложен, все же.

List nodes = new ArrayList();
0
добавлено

Я просто сделал это - отмечает, что, поскольку вы прилагаете ребенка, вы на самом деле перемещаете его от одного элемента до другого, таким образом, индекс остается то же самое.

public void appendNodeList(Element TargetElement, NodeList nl) {

    int cnt = nl.getLength();

    for (int i=0; i
0
добавлено

Я просто сделал это - отмечает, что, поскольку вы прилагаете ребенка, вы на самом деле перемещаете его от одного элемента до другого, таким образом, индекс остается то же самое.

public void appendNodeList(Element TargetElement, NodeList nl) {

    int cnt = nl.getLength();

    for (int i=0; i
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async