1

我不确定这是否可能,所以无论如何我都想询问并澄清,因为即使经过大量搜索和尝试,我也无法在这里找到类似的东西。如果发现重复真的很抱歉。

我正在尝试使用XMLStreamReader. localpart阅读后,我必须根据我需要将其分配XMLStreamReader给不同的类进行一些检查。

当我进行少量检查时,我需要检查current localpart以及next localpart. 当我尝试检查next localpart我正在推进到next元素时XMLStreamReader。因此,我尝试将其存储current XMLStreamReader在另一个中temp XMLStreamReader,但是在分配之后,当我尝试导航到下一个时,我猜current XMLStreamReader即使它temp XMLStreamReader正在发生变化,因此我无法执行某些操作。主要是我想JAXB Unmarshalling在它失败的时候执行它,因为它无法获取类的所有元素。

我知道XMLEventReaderpeek()但也失败了,所以我试图存储current XMLStreamReader但它也不起作用,我读到它不是最有效的内存。由于我的 XML 文件可能非常大,我正在尝试使用XMLStreamReader.

public class Main
{
    public static void main(String[] args) {
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("Customer.xml");
        final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        final XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(xmlStream);
        //final JAXBContext jaxbContext = JAXBContext.newInstance("io.model.jaxb");
        //final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        
        //Navigate to next and start of the XML Elements
        xmlStreamReader.next();
        
        //Read Until the end of the file
        while (xmlStreamReader.hasNext()) {
            
            //Check if the current `XML Tag` is "extension"
            if (xmlStreamReader.isStartElement() && xmlStreamReader.getLocalName().equalsIgnoreCase("extension")) {
                
                //Create a tempStream to store the current stream values
                //final XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader((InputStream) xmlStreamReader);
                final XMLStreamReader tempReader = xmlStreamReader;
                xmlStreamReader.next();
                
                //If the next element is "nextextension"
                if (xmlStreamReader.isStartElement() && xmlStreamReader.getLocalName().equalsIgnoreCase("nextextension")) {
                    System.out.println("Double Extension Assign to CLASS C with both extension tag");
                    //final C cInfo = unmarshaller.unmarshal(streamReader, C.class).getValue();
                }else{
                    System.out.println("Single Extension Assign to CLASS B with single extension tag");
                    //final B cInfo = unmarshaller.unmarshal(streamReader, B.class).getValue();
                }
                
            }
            
            //Move to the next
            xmlStreamReader.next();
        }
    }
}

我希望我能够解释这个问题。我想知道是否有办法实现以下任何一项:

  1. 暂时存放current XMLStreamReader在另一个temp XMLStreamReader,以便以后使用。
  2. 如果有其他方法可以peek()进入next localpartinside XMLStreamReader

从昨天开始我就陷入了这个问题,因此从这里的专家那里获得一些意见真是太好了。

4

1 回答 1

0

发布此答案,因为它可能对将来的某人有用。经过大量尝试和研究,我发现我们可以将流存储在MutableXMLStreamBuffer.

//Store the XMLStreamReader values within the buffer
final MutableXMLStreamBuffer buffer = new MutableXMLStreamBuffer();
buffer.createFromXMLStreamReader(xmlStreamReader);

然后您可以使用以下方法访问相同的内容:

buffer.readAsXMLStreamReader()
于 2021-06-06T09:00:34.600 回答