Ниже приведена моя реализация в соответствии с тем, как я понял ваш вопрос.
Я создал следующий файл XML, который содержит только примеры данных из вашего вопроса.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<settDate>2020-02-29</settDate>
<publishingPeriodCommencingTime>09:55:00</publishingPeriodCommencingTime>
<fuelTypeGeneration>31891</fuelTypeGeneration>
<settDate>2020-02-29</settDate>
<publishingPeriodCommencingTime>10:00:00</publishingPeriodCommencingTime>
<fuelTypeGeneration>31743</fuelTypeGeneration>
</root>
В результате экспериментов Я увидел, что эффективный порядок событий XML:
- START_ELEMENT
- CHARACTERS
- END_ELEMENT
Элементы представляют интерес:
- resolDate
- publishingPeriodCommencingTime
- fuelTypeGeneration
Поэтому базовый c алгоритм:
- Если тип события START_ELEMENT и имя события
settDate
, создайте новый экземпляр класса RollingD
. - Если тип события - CHARACTERS, то задайте значение члена в
RollingD
в соответствии с именем события. - Если тип события END_ELEMENT и имя события
fuelTypeGeneration
, добавьте объект RollingD
в список.
Обратите внимание, что вам нужно замените path-to- XML -file в приведенном ниже коде w Это фактический путь к вашему XML файлу.
Кроме того, метод toString()
в классе RollingD
предназначен исключительно для целей отладки и поэтому может быть безопасно удален из приведенного ниже кода, если вы считаете, что это не так. нужно это.
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class StaxTest {
private static final String SETT_DATE = "settDate";
private static final String PUBLISHING_PERIOD_COMMENCING_TIME = "publishingPeriodCommencingTime";
private static final String FUEL_TYPE_GENERATION = "fuelTypeGeneration";
public static void main(String[] args) {
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = null;
Path path = Paths.get("path-to-XML-file");
try (FileInputStream fis = new FileInputStream(path.toFile())) {
reader = xmlInputFactory.createXMLEventReader(fis);
List<RollingD> list = new ArrayList<>();
RollingD rD = null;
String localName = null;
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
switch (event.getEventType()) {
case XMLEvent.START_ELEMENT:
StartElement elem = event.asStartElement();
QName qName = elem.getName();
localName = qName.getLocalPart();
switch (localName) {
case SETT_DATE:
rD = new RollingD();
break;
case PUBLISHING_PERIOD_COMMENCING_TIME:
break;
case FUEL_TYPE_GENERATION:
break;
default:
}
break;
case XMLEvent.END_ELEMENT:
EndElement endElem = event.asEndElement();
QName qNamEnd = endElem.getName();
String endName = qNamEnd.getLocalPart();
switch (endName) {
case SETT_DATE:
break;
case PUBLISHING_PERIOD_COMMENCING_TIME:
break;
case FUEL_TYPE_GENERATION:
list.add(rD);
break;
default:
}
break;
case XMLEvent.CHARACTERS:
Characters chars = event.asCharacters();
if (!chars.isWhiteSpace()) {
String data = chars.getData();
switch (localName) {
case SETT_DATE:
rD.setSettDate(data);
break;
case PUBLISHING_PERIOD_COMMENCING_TIME:
rD.setPublishingPeriodCommencingTime(data);
break;
case FUEL_TYPE_GENERATION:
rD.setFuelTypeGeneration(data);
break;
default:
}
}
break;
default:
System.out.println("Unhandled XML event: " + event.getEventType());
}
}
list.stream().forEach(System.out::println); // Prints the list.
}
catch (IOException | XMLStreamException x) {
x.printStackTrace();
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (XMLStreamException xXmlStream) {
System.out.println("WARNING (ignored): Failed to close XML event reader");
xXmlStream.printStackTrace();
}
}
}
}
}
class RollingD {
private String settDate;
private String publishingPeriodCommencingTime;
private String fuelTypeGeneration;
public RollingD() {
this(null, null, null);
}
public RollingD(String settDate,
String publishingPeriodCommencingTime,
String fuelTypeGeneration) {
this.settDate = settDate;
this.publishingPeriodCommencingTime = publishingPeriodCommencingTime;
this.fuelTypeGeneration = fuelTypeGeneration;
}
public void setSettDate(String settDate) {
this.settDate = settDate;
}
public void setPublishingPeriodCommencingTime(String publishingPeriodCommencingTime) {
this.publishingPeriodCommencingTime = publishingPeriodCommencingTime;
}
public void setFuelTypeGeneration(String fuelTypeGeneration) {
this.fuelTypeGeneration = fuelTypeGeneration;
}
public String toString() {
return String.format("%s,%s,%s",
settDate,
publishingPeriodCommencingTime,
fuelTypeGeneration);
}
}
Вот вывод, который я получаю после выполнения вышеуказанного кода.
2020-02-29,09:55:00,31891
2020-02-29,10:00:00,31743