Дадайце некалькі нодлистов ў Java

Я спрабаваў на працягу некалькіх гадзін, каб дадаць тры нодлистов і недагляд. Ці можаце вы мне дапамагчы?

Я зрабіў наступны код:

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 нодлистов, і я не магу зразумець, чаму.

Дарэчы, у мяне такая ж памылка ў 3 радкі: «Нечаканы тып - патрабуецца пераменная - знойдзена значэнне». Чаму гэта адбываецца?

1
Я бачыў яго. Я здолеў прымусіць яго працаваць. Дзякуй ў любым выпадку
дададзена аўтар SaintLike, крыніца

10 адказы

Адна праблема ў тым, што:

nList.item(i)

атрымлівае значэнне, дзе, як ён выглядае, як вы спрабуеце ўсталяваць значэнне гэтага. Вы не можаце прысвоіць нічога nList.item (я) . <�Код> 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
дададзена
Дзякуючы. Я думаю, што я не магу атрымаць укладзеныя элементы з вузла, калі яны знаходзяцца ў нармальным ArrayList. Ці ёсць спосаб зрабіць гэта?
дададзена аўтар SaintLike, крыніца
Добра, дзякуй. ён працуе :)
дададзена аўтар SaintLike, крыніца
Вядома, вы можаце. А Вузел па-ранейшаму Node незалежна ад таго, якая структура дадзеных яго захоўваецца ў ( NodeList супраць рэгулярнага List ). Дайце яму шанец і адправіць назад, калі вы сутыкнецеся з праблемамі.
дададзена аўтар cmbaxter, крыніца

Адна праблема ў тым, што:

nList.item(i)

атрымлівае значэнне, дзе, як ён выглядае, як вы спрабуеце ўсталяваць значэнне гэтага. Вы не можаце прысвоіць нічога nList.item (я) . <�Код> 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
дададзена
Дзякуючы. Я думаю, што я не магу атрымаць укладзеныя элементы з вузла, калі яны знаходзяцца ў нармальным ArrayList. Ці ёсць спосаб зрабіць гэта?
дададзена аўтар SaintLike, крыніца
Добра, дзякуй. ён працуе :)
дададзена аўтар SaintLike, крыніца
Вядома, вы можаце. А Вузел па-ранейшаму Node незалежна ад таго, якая структура дадзеных яго захоўваецца ў ( NodeList супраць рэгулярнага List ). Дайце яму шанец і адправіць назад, калі вы сутыкнецеся з праблемамі.
дададзена аўтар 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
дададзена