如何使XStream解析来自StAX的部分输入

时间:2017-05-18 21:10:04

标签: java xml xstream stax

我是Stax和XStream的新手。我试图从巨大的XML流中解放一些常见的元素(可能有150万到250万个元素要解组)

我尝试使用Stax解析流以获取感兴趣的元素,然后调用xStream将XML解析为EndElement。

XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(fis);
            while (reader.hasNext()) {
                if (reader.isStartElement() && reader.getLocalName().toLowerCase().equals("person")) {
                    break;
                }
                reader.next();
            }

            StaxDriver sd = new StaxDriver();
            AbstractPullReader rd = sd.createStaxReader(reader);
            XStream xstream = new XStream(sd);
            xstream.registerConverter(new PersonConverter());
            Person p = (Person) xstream.unmarshal(rd);

我创建了一个测试输入     <Persons> <Person> <name>A</name> </Person> <Person> <name>B</name> </Person> <Person> <name>C</name> </Person> </Persons>

问题在于,首先我的转换器没有被调用。其次,我在Person中为元素“name”获取了CannotResolveClassException,而XStream没有创建我的Person对象。 我在代码中错过了什么?

1 个答案:

答案 0 :(得分:1)

当您实例化AbstractPullReader时,它将从流中读取第一个open-element事件,建立&#34; root&#34;元件。因为您已经阅读了第一个Person事件,所以它会前进到下一个事件(name),但它并不知道如何解组。

您必须做两件事才能使您的示例有效:

首先,将元素名Person别名为java类

xstream.alias("Person", Person.class);

其次,只有在你想要阅读的之前,才能将SAX光标前进到元素:

while (reader.hasNext()) {         
    if (reader.isStartElement() && reader.getLocalName().equals("Persons")) {            
        break;
    }
    reader.next();
}