【问题标题】:Chunking XML with XMLStreamReader failing使用 XMLStreamReader 分块 XML 失败
【发布时间】:2015-06-16 10:46:24
【问题描述】:

我正在尝试使用 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();

我能够正确读取第一条记录。但是在读取第一条记录后,流将移动到第二条记录内部,而不是 .因此我无法处理第二条记录。我不确定我哪里出错了。请帮忙。

【问题讨论】:

    标签: java xml jaxb stax


    【解决方案1】:

    解决办法如下:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-23
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多