добавить элементы из XML в arraylist - PullRequest
0 голосов
/ 28 марта 2020

Я написал следующий код. Однако я бы хотел добавить элементы из characters.getData() в пользовательский массив, как показано ниже, чтобы затем использовать его для математического построения графиков. Как я могу создать свой собственный список пользовательских массивов, содержащий settDate, publishingPeriodCommencingTime и publishingPeriodCommencingTime?

while(parser.hasNext()) {
    XMLEvent event = parser.nextEvent();

    switch(event.getEventType()) {
        case XMLStreamConstants.START_ELEMENT:
            StartElement startElement = event.asStartElement();
            String qName = startElement.getName().getLocalPart();

            if (qName.equalsIgnoreCase("settDate")) {
                bMarks = true;
            } else if (qName.equalsIgnoreCase("publishingPeriodCommencingTime")) {
                bLastName = true;
            } else if (qName.equalsIgnoreCase("fuelTypeGeneration")) {
                bNickName = true;
            }
            break;
        case XMLStreamConstants.CHARACTERS:
            Characters characters = event.asCharacters();
            if(bMarks) {
                System.out.println("settDate: " + characters.getData());
                bMarks = false;
            }
            if(bLastName) {
                System.out.println("publishingPeriodCommencingTime: " + characters.getData());
                bLastName = false;
            }
            if(bNickName) {
                System.out.println("fuelTypeGeneration: " + characters.getData());
                bNickName = false;
            }
            rollingD subAction= new RollingD(characters.getData(), characters.getData(), characters.getData()); 
            break;
        case XMLStreamConstants.END_ELEMENT:
            EndElement endElement = event.asEndElement();
            if(endElement.getName().getLocalPart().equalsIgnoreCase("item")) {

                System.out.println();
            }
            break;
    } 
}

Это мой пользовательский класс

public class RollingD {
    private String settDate;
    private String publishingPeriodCommencingTime;
    private String fuelTypeGeneration;

    RollingD(String bMarks, String bLastName, String bNickName) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public String getSettDate() {
        return settDate;
    }

    public void setSettDate(String settDate) {
        this.settDate = settDate;
    }

    public String getPublishingPeriodCommencingTime() {
        return publishingPeriodCommencingTime;
    }

    public void setPublishingPeriodCommencingTime(String publishingPeriodCommencingTime) {
        this.publishingPeriodCommencingTime = publishingPeriodCommencingTime;
    }

    public String getFuelTypeGeneration() {
        return fuelTypeGeneration;
    }

    public void setFuelTypeGeneration(String fuelTypeGeneration) {
        this.fuelTypeGeneration = fuelTypeGeneration;
    }
}

Это образец XML

<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>

..

1 Ответ

1 голос
/ 04 апреля 2020

Ниже приведена моя реализация в соответствии с тем, как я понял ваш вопрос.

Я создал следующий файл 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:

  1. START_ELEMENT
  2. CHARACTERS
  3. END_ELEMENT

Элементы представляют интерес:

  1. resolDate
  2. publishingPeriodCommencingTime
  3. 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
...