Я хочу объединить два списка узлов и получить новый список узлов. На данный момент мои XMLs выглядеть следующим образом: Первый XML:Java: Совместить два XML NodeList
<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");
И теперь возникает вопрос: Как я могу объединить два списка, так что у меня есть один список «ценности» и один список «дней «?
Мне нужен новый 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 или для циклов. Без конкатенации и только одного большого списка программа очень быстрая.
вам нужно 'NodeList's ли продолжать быть динамичным? –
Попробуйте col.retainAll (otherCol) // для пересечения и col.addAll (otherCol) // для объединения из класса Collection и посмотреть, есть ли улучшения –
@ T.J. Crowder Dynamic? Я не знаю что ты имеешь ввиду. Этот кодовый блок выше вызывается после запуска программы, а затем я просто работаю с значениями/днями NodeLists. – asdf