1

我已经尝试了几个小时来附加三个 NodeList 并且失败了。你能帮我么?

我制作了以下代码:

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 个 NodeList,我似乎无法弄清楚原因。

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

4

5 回答 5

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));
   }
   ...
于 2013-05-22T19:37:24.670 回答
0

NodeList本身是非常基本的,仅用于迭代Nodes. 要在将根对象传递给您的方法后创建一个新NodeList的使用,如下所示。ElementDocument

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();
}
于 2013-05-22T20:02:14.913 回答
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();
  }
于 2013-05-22T19:57:47.953 回答
0

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

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

不过,更好的方法是使用 cmbaxter 建议的 List 。

List<Node> nodes = new ArrayList<Node>();
于 2013-05-22T19:48:32.367 回答
0

我只是这样做了 - 请注意,当您附加孩子时,您实际上是将其从一个元素移动到另一个元素,因此索引号保持不变。

public void appendNodeList(Element TargetElement, NodeList nl) {

    int cnt = nl.getLength();

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

}
于 2015-06-11T08:39:55.950 回答