有没有办法将 XMLStreamReader 值临时存储在另一个 XMLStreamReader 中以进行验证?

Is there a way to store the XMLStreamReader values temporarily within another XMLStreamReader for validations?

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

我正在尝试使用 XMLStreamReader 解析 XML 文件。阅读后我必须对我的 localpart 进行一些检查,根据这些我需要将此 XMLStreamReader 分配给不同的 classes.

当我进行少量检查时,我需要检查 current localpart 以及 next localpart。当我尝试检查 next localpart 时,我正在前进到 XMLStreamReader 上的 next 元素。所以我试图将 current XMLStreamReader 存储在另一个 temp XMLStreamReader 中但是在分配之后当我尝试导航到 current XMLStreamReader 上的下一个时甚至 temp XMLStreamReader 也在改变我猜是由于我无法执行某些操作。主要是我想执行 JAXB Unmarshalling 期间失败,因为它无法获取 class.

的所有元素

我知道 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()进入XMLStreamReader内的next localpart

如果我从昨天起就被困在这个问题上,能在这里得到专家的一些意见真是太好了。

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

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

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

buffer.readAsXMLStreamReader()