У меня есть требование для группировки элементов XML с тем же атрибутом в Java.Как группировать элементы xml в java по атрибутам
Ниже мой обновленный вход:
<root>
<Slots date="2015-11-17">
<TimePeriod value="8-17">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298451</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
<Slots date="2015-11-17">
<TimePeriod value="8-17">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298452</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
<Slots date="2015-11-18">
<TimePeriod value="2-8">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298451</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
<Slots date="2015-11-18">
<TimePeriod value="2-8">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298452</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
Мне нужен выход, как показано ниже:
<root>
<Slots date="2015-11-17">
<TimePeriod value="8-17">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298451</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298452</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
<Slots date="2015-11-18">
<TimePeriod value="2-8">
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298451</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
<ContractorAvailable ContractorID="H4CONT07">
<GroupId>298452</GroupId>
<OfferToken>10315009</OfferToken>
<Capacity>99</Capacity>
</ContractorAvailable>
</TimePeriod>
</Slots>
</root>
Я пытался что-то вроде ниже:
HashSet<String> set = new HashSet<String>();
if(node!= null && node.getLength() > 0) {
for(int i=0;i<node.getLength();i=i+1)
{
Node slots = node.item(i);
set.add(slots.getAttributes().getNamedItem("date").getNodeValue());
}
}
System.out.println("slots dates are --- **** "+ set);
ArrayList<Node> deleteList = new ArrayList<Node>();
for(String date : set)
{ System.out.println("slots dates is --- **** "+ "2015-11-18");
Node remainingNode = null;
for(int i=0;i<node.getLength();i=i+1)
{
Node slotnode = node.item(i);
if(slotnode.getAttributes() != null && slotnode.getAttributes().getNamedItem("date")!= null && "2015-11-18".equals(slotnode.getAttributes().getNamedItem("date").getNodeValue()))
{System.out.println("inside time 18");
if(remainingNode == null)
remainingNode = slotnode;
else {
NodeList nodeps = slotnode.getChildNodes();
for(int j=0;j<nodeps.getLength();j=i+1) {
remainingNode.appendChild(nodeps.item(j));
}
deleteList.add(slotnode);
}
}
}
NodeList nodesItems = doc1.getElementsByTagName("root");
nodesItems.item(0).appendChild(remainingNode);
I попробовал с использованием Dom par ser, но я не мог этого сделать. Я новичок в XML, искал везде, но ничего не нашел, может ли кто-нибудь помочь мне в этом. Примечание: Я не могу использовать JAXB для этого решения.
Да, у меня есть слоты для группы по дате, а затем дополнительно по значению TimePeriod. XSLT не поддерживается инструментом, который я использую
Рассмотрим сделать группировку в языке, как XSLT 2.0 (http://www.w3.org/TR/xslt20/#grouping-examples) или XQuery 3 (http://www.w3.org/TR/xquery-30/# id-group-by), которые на Java поддерживаются, например, Saxon 9, доступными в версии с открытым исходным кодом из http://saxon.sourceforge.net/. –
Какую версию Java вы используете? –
Можете ли вы предоставить хорошо сформированный образец XML с одним корневым элементом? Вам нужно сгруппировать «Слоты» по «дате», а затем дополнительно «значение TimePeriod»? Или это значение одинаково для всех «слотов» с той же «датой»? –