gpt4 book ai didi

java - 将 XML 中的项目添加到 arraylist

转载 作者:行者123 更新时间:2023-12-02 08:49:05 26 4
gpt4 key购买 nike

我编写了以下代码。不过,我想将 characters.getData() 中的项目添加到自定义数组中,如下所示,以便我可以使用它来进行数学绘图。如何创建包含 settDatepublishingPeriodCommencingTimepublishingPeriodCommencingTime 的自定义数组列表?

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>

..

最佳答案

下面是我根据我如何理解你的问题的实现。

我创建了以下 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. 人物
  3. END_ELEMENT

感兴趣的元素是:

  1. 设置日期
  2. 发布期间开始时间
  3. 燃料类型生成

因此基本算法是:

  • 如果事件类型为 START_ELEMENT 并且事件名称为 settDate,则创建 RollingD 类的新实例。
  • 如果事件类型为CHARACTERS,则根据事件名称设置RollingD中成员的值。
  • 如果事件类型为 END_ELEMENT 并且事件名称为 fuelTypeGeneration,请将 RollingD 对象添加到列表中。

请注意,您需要将以下代码中的XML 文件路径替换为 XML 文件的实际路径。

此外,RollingD 类中的方法 toString() 纯粹用于调试目的,因此如果您认为不需要它,可以安全地从下面的代码中删除它.

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

关于java - 将 XML 中的项目添加到 arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60900884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com