2017-05-18 60 views
0

我是Stax和XStream的新手。我试图从大量的XML流中解开一些常见的元素(可能有150万到250万个解组元素)如何让XStream解析来自StAX的部分输入

我试图通过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

当你实例化一个AbstractPullReader它将从流中读取第一个开放元素事件,建立“根”元素。因为您已经阅读了第一个Person事件,它将前进到下一个(name),它不知道如何解组。

你必须做两件事情,使您的工作例如:

首先,别名元素名称Person到Java类

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

其次,只有推动SAX光标到元件之前你想读的:

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

谢谢。这有效,但我不得不在我想解析的那个元素之前停止一个元素。如果人员可能包含一些可选元素作为其第一个孩子会怎么样? StAX阅读器API不提供“向前看”方法。 – Bassam