【发布时间】:2014-12-19 01:38:02
【问题描述】:
我想连接两个节点列表并获得一个新的节点列表。目前我的 XML 文档如下所示: 第一个 XML:
<machine>
<values>
<value1> <...> </value1>
<value2> <...> </value2>
</values>
<days>
<value1> <...> </value1>
<value2> <...> </value2>
</days>
</machine>
第二个 XML:
<machine>
<values>
<value3> <...> </value1>
<value4> <...> </value2>
</values>
<days>
<value3> <...> </value1>
<value4> <...> </value2>
</days>
</machine>
目前我只使用一个带有以下内容的 XML:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = null;
document = builder.parse(myxml.xml);
NodeList values = document.getElementsByTagName("values");
NodeList days = document.getElementsByTagName("days");
然后使用值和天数处理 NodeList。我的程序运行良好。现在我以同样的方式创建第二个列表,所以:
DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance();
DocumentBuilder builder2 = factory2.newDocumentBuilder();
Document document2 = null;
document2 = builder2.parse(myxml_second.xml);
NodeList values2 = document.getElementsByTagName("values");
NodeList days2 = document.getElementsByTagName("days");
这提出了一个问题:
如何将两个列表连接起来,得到一个列表values 和一个列表days?
我需要一个新的 NodeList(类型),因为我的整个程序都使用 NodeList 类型。
我发现了几个线程来解决这个问题,但没有任何效果或返回另一种类型,但不是 NodeList。一种方法有效:
public static NodeList join(final NodeList... lists) {
class JoinedNodeList implements NodeList {
public int getLength() {
int len = 0;
for (NodeList list : lists) {
len += list.getLength();
}
return len;
}
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();
}
然后我的程序完美地与连接的 NodeList 一起工作,但它变得很慢!我认为它来自覆盖这两种方法,因为我在 while 或 for 循环中经常使用它们。没有串联和只有一个大列表,程序非常快。
【问题讨论】:
-
您是否需要
NodeLists 才能继续保持动态? -
尝试 col.retainAll(otherCol) // 用于交集和 col.addAll(otherCol) // 用于 Collection 类的并集,看看是否有任何改进
-
@T.J.克劳德动态?我不知道你是什么意思。一旦程序启动,就会调用上面的这个代码块,然后我只使用 NodeLists 值/天
-
@РоманГуйван 你说的retainAll是什么意思?你能和我的两个 NodeList 共享一个代码 sn-p 吗?!谢谢你!