1

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

  • 光标 API
  • 迭代器 API
  • Cursor API是你使用的地方XMLStreamReader,它的next()hasNext()方法。用法
    与上面大致相同。Iterator APIXMLEventReader

    Iterator API本书仅用一段描述性不强的段落总结了这一点。它表示当您想查看接下来会发生什么事件时使用它,并且基于 的值XMLEvent,您可以使用XMLStreamReader跳过或处理即将发生的事件。

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

    用于光标 API 的 SSCCE

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

    1 回答 1

    2

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

    因此,XMLStreamReader性能更好,同时XMLEventReader为您提供更多开箱即用的功能。

    于 2013-06-04T07:06:57.527 回答