在Java中附加几个NodeLists

时间:2013-05-22 19:32:19

标签: java xml parsing nodelist

我一直在努力追加三个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,我似乎无法找出原因。

顺便说一句,我在3行中有相同的错误:“意外的类型 - 必需的变量 - 找到的值”。 为什么会这样?

5 个答案:

答案 0 :(得分:2)

一个问题是:

nList.item(i)

获取一个值,因为您似乎正在尝试为其设置值。您无法为nList.item(i)分配任何内容。 NodeList接口本身没有将新项目附加到列表中的操作。您可能希望查看NodeList的基础类型,并查看是否可以向其添加项目。此外,您没有构建nList变量。 NodeList是一个界面。你打算把它创建为什么?

如果您不希望将其作为NodeList,那么您可以非常轻松地将其作为常规List<Node>。像这样:

   List<Node> nodes = new ArrayList<Node>();
   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));
   }
   ...

答案 1 :(得分:0)

如果你真的想使用NodeList,你可以这样做:

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

更好的方法是使用List作为cmbaxter建议。

List<Node> nodes = new ArrayList<Node>();

答案 2 :(得分: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();
  }

答案 3 :(得分:0)

NodeList本身非常基本,仅用于迭代Node。要创建新的NodeList,请在将根Element对象传递给方法后使用Document,如下所示。

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();
}

答案 4 :(得分:0)

我刚刚这样做 - 请注意,当你追加孩子时,你实际上是将它从一个元素移动到另一个元素,所以索引号保持不变。

public void appendNodeList(Element TargetElement, NodeList nl) {

    int cnt = nl.getLength();

    for (int i=0; i<cnt; i++) {
        TargetElement.appendChild(nl.item(0)); 
    }

}