我尝试将 anXMLStreamReader
与 a 结合使用StreamFilter
以从 XML 文件中部分读取。其核心方法如下所示:
public ScheduleList getScheduleListFromXMLFile(File scheduleListFile, ScheduleTimeRange scheduleTimeRange) {
ScheduleList scheduleList = null;
try {
JAXBContext context = JAXBContext.newInstance(this.getJAXBContextClasses());
Unmarshaller unMarsh = context.createUnmarshaller();
InputStream inputStream = new FileInputStream(scheduleListFile);
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream);
// --- Check if a system state filter is to be applied ------------
if (scheduleTimeRange!=null && scheduleTimeRange.isValidTimeRange()==true) {
// --- Add a filter to the XMLStreamReader --------------------
xmlStreamReader = xmlInputFactory.createFilteredReader(xmlStreamReader, new ScheduleList_XMLStreamFilter(scheduleTimeRange));
}
JAXBElement<ScheduleList> jaxbElement = (JAXBElement<ScheduleList>) unMarsh.unmarshal(xmlStreamReader);
xmlStreamReader.close();
inputStream.close();
if (jaxbElement!=null) {
// --- Check if the loaded object is of the required type -----
Object loadedObject = jaxbElement.getValue();
if (loadedObject instanceof ScheduleList) {
scheduleList = (ScheduleList) loadedObject;
} else {
JOptionPane.showMessageDialog(this.getOwnerFrame(), getWarningString(), "Wrong object type", JOptionPane.ERROR_MESSAGE);
}
}
} catch (JAXBException e) {
if (e.getCause() instanceof InstantiationException) {
// --- Try to load based on the previous version ---
scheduleList = EomModelUpdater.getScheduleListFromXMLFile(scheduleListFile);
} else {
e.printStackTrace();
}
} catch (IOException | XMLStreamException ex) {
ex.printStackTrace();
} finally {
convertToTreeScheduleList(scheduleList);
}
return scheduleList;
}
如果 'scheduleTimeRange' 为空,则不会应用过滤器并且解组操作工作正常。如果应用了过滤器,则操作不会从方法/行返回
JAXBElement<ScheduleList> jaxbElement = (JAXBElement<ScheduleList>) unMarsh.unmarshal(xmlStreamReader);
,即使应用的过滤器也告诉我已到达文档末尾。实现 StreamFilter 的过滤器的 'accept(XMLStreamReader reader)' 方法如下所示:
public boolean accept(XMLStreamReader reader) {
if (reader.isStartElement()==true) {
// --- Starting elements --------------------
if (reader.getLocalName().equals("TechnicalSystemStateList")==true) {
// --- Set default accept ---------------
this.acceptSystemState = true;
} else if (reader.getLocalName().equals("GlobalTime")==true) {
// --- Check if TSSE can be accepted ----
try {
String globalTimeText = reader.getElementText();
Long globalTime = this.parseLong(globalTimeText);
if (globalTime!=null) {
this.acceptSystemState = this.scheduleTimeRange.isWithinTimeRange(globalTime);
}
} catch (XMLStreamException xmlStreamEx) {
xmlStreamEx.printStackTrace();
}
}
} else if (reader.isEndElement()==true) {
// --- Ending elements ----------------------
if (reader.getLocalName().equals("TechnicalSystemStateList")) {
return this.acceptSystemState;
}
}
try {
if (reader.hasNext()==false) {
System.out.println("Found end of document");
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
return true;
}
我不知道这里出了什么问题,并且会很高兴得到提示。目前,我们正在使用 Java 8 (jdk1.8.0_191)。