繁体   English   中英

用XMLStreamReader分割XML失败

[英]Chunking XML with XMLStreamReader failing

我正在尝试使用StAX和JAXB将大型XML分成较小的块。 这是我正在处理的示例XML:

<asset>
    <entity>
        <record>
            <field>
                <id>remarks</id>
                <value>ready to test1</value>
            </field>
        </record>
        <record>
            <field>
                <id>input_quarter</id>
                <value>Jun-Sep</value>
            </field>
        </record>
    </entity>
</asset>

我想一次阅读记录并进行处理。 这是我的做法:

ClassPathResource classPathResource = new ClassPathResource("samples/form2/data/test.xml");
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(classPathResource.getInputStream());

JAXBContext jaxbContext = JAXBContext.newInstance(EntityRecordData.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
while(xmlStreamReader.hasNext()){
    int eventType = xmlStreamReader.next();
    switch (eventType) {
    case XMLEvent.START_ELEMENT:
        System.out.println("Element: "+xmlStreamReader.getLocalName());
        if("record".equals(xmlStreamReader.getLocalName())){
            Object unmarshal = unmarshaller.unmarshal(xmlStreamReader);
        }
        break;
    case XMLEvent.CHARACTERS: 
        String text = xmlStreamReader.getText();
        System.out.println("Text: "+text);
        break;
    case XMLEvent.END_ELEMENT: 
        break;
    default : break;
    }
}
xmlStreamReader.close();

我能够正确读取第一条记录。 但是在读取了第一条记录之后,流将移至第二条记录而不是。 因此,我无法处理第二条记录。 我不确定我要去哪里错。 请帮忙。

解决方法如下:

ClassPathResource classPathResource = new ClassPathResource("samples/form2/data/test.xml");
    XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
    xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
    XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(classPathResource.getInputStream());

    JAXBContext jaxbContext = JAXBContext.newInstance(EntityRecordData.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    int eventType = xmlStreamReader.next();
    while(true){
        switch (eventType) {
        case XMLEvent.START_ELEMENT:
            System.out.println("Element: "+xmlStreamReader.getLocalName());
            if("record".equals(xmlStreamReader.getLocalName())){
                JAXBElement<EntityRecordData> unmarshal = unmarshaller.unmarshal(xmlStreamReader, EntityRecordData.class);
                final List<IFieldData> fields = unmarshal.getValue().getFields();
                System.out.println("**"+fields.get(0).getId());
            } else {
                eventType = xmlStreamReader.next();
            }
            break;
        case XMLEvent.CHARACTERS: 
            String text = xmlStreamReader.getText();
            System.out.println("Text: "+text);
            eventType = xmlStreamReader.next();
            break;
        case XMLEvent.END_ELEMENT: 
            //System.out.println("End: "+xmlStreamReader.getLocalName());
            eventType = xmlStreamReader.next();
            break;
        default : 
            break;
        }

        if(!xmlStreamReader.hasNext()){
            break;
        }
    }
    xmlStreamReader.close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM