我一直在努力追加三个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行中有相同的错误:“意外的类型 - 必需的变量 - 找到的值”。 为什么会这样?
答案 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));
}
}