了解StAX的Cursor API和Iterator API之间的区别

时间:2013-05-04 17:57:47

标签: java xml iterator cursor stax

好的,在学习如何使用StAX API处理XML时。我看到有两种方法可以解析XML文档:

  • Cursor API
  • Iterator API
  • Cursor API是您使用XMLStreamReader及其next()hasNext()方法的地方。
    Iterator API使用XMLEventReader的方式与上述方法大致相同。

    这本书总结了Iterator API只是一段不太具描述性的段落。它表示当您想要查看接下来会发生什么事件并根据XMLEvent的值时使用此功能时,您可以使用XMLStreamReader跳过或处理即将发生的事件。

    我无法理解这一点。有人可以解释如何?

    SSCCE for Cursor API

    import javax.xml.stream.*;
    import javax.xml.stream.events.*;
    import java.io.*;
    
    public class StaxCursorDemo{
        public static void main(String[] args){
            try{
                XMLInputFactory inputFactory = XMLInputFactory.newInstance();
                InputStream input = new FileInputStream(new File("helloWorld.xml"));
                XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(input);
    
                while(xmlStreamReader.hasNext()){
                    int event = xmlStreamReader.next();
                    if(event == XMLStreamConstants.START_DOCUMENT){
                        System.out.println("Beginning parsing of document");
                    }
                    if(event == XMLStreamConstants.END_DOCUMENT){
                        System.out.println("Ending parsing of document");
                    }
                    if(event == XMLStreamConstants.COMMENT){
                        System.out.println("NOTE: " + xmlStreamReader.getText());
                    }
                    if(event == XMLStreamConstants.START_ELEMENT){
                        System.out.println("Beginning Element: " + xmlStreamReader.getLocalName());
                        for(int i = 0;i<xmlStreamReader.getAttributeCount();i++){
                            System.out.println("Attribute is: " + xmlStreamReader.getAttributeLocalName(i));
                            System.out.println("Attribute value is: " + xmlStreamReader.getAttributeValue(i));
                        }
                    }
                    if(event == XMLStreamConstants.END_ELEMENT){
                        System.out.println("End Element: ");
                    }
                    if(event == XMLStreamConstants.CHARACTERS){
                        System.out.println("Value: " + xmlStreamReader.getText());
                    }
                }
            }catch(FactoryConfigurationError e){
                System.out.println(e.getMessage());
            }catch(XMLStreamException e){
                System.out.println(e.getMessage());
            }catch(IOException e){
                System.out.println(e.getMessage());
            }
        }
    }
    

    1 个答案:

    答案 0 :(得分:2)

    可能还有更多内容,但XMLEventReader提供XMLEvent - 提供更多灵活性和功能的对象,而XMLStreamReader不会为您创建这些对象。

    因此,XMLStreamReader效果更好,XMLEventReader为您提供了更多功能。