了解 XMLStreamReader 和 START_DOCUMENT

发布于 2025-01-12 08:25:08 字数 1919 浏览 1 评论 0原文

考虑以下 XML 文件:

% cat test.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
</root>

为什么在使用 XMLStreamReader。代码是(摘自):

% cat Demo.java
import java.io.FileReader;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));
        System.out.println(sr.getClass());

        while (sr.hasNext()) {
            int eventType = sr.next();

            if (eventType == XMLStreamReader.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamReader.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamReader.END_ELEMENT) {
                System.out.println("End Element:    " + sr.getLocalName());
            } else if (eventType == XMLStreamReader.START_ELEMENT) {
                System.out.println("Start Element:  " + sr.getLocalName());
            }
        }
    }

}

我这边的输出:

% javac Demo.java
% java Demo test.xml
class com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
Start Element:  root
End Element:    root
End Document

参考:

% java --version
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment (build 11.0.14+9-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.14+9-post-Debian-1deb11u1, mixed mode, sharing)

Consider the following XML file:

% cat test.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
</root>

Why am I not getting a START_DOCUMENT event when using XMLStreamReader. Code is (lifted from):

% cat Demo.java
import java.io.FileReader;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));
        System.out.println(sr.getClass());

        while (sr.hasNext()) {
            int eventType = sr.next();

            if (eventType == XMLStreamReader.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamReader.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamReader.END_ELEMENT) {
                System.out.println("End Element:    " + sr.getLocalName());
            } else if (eventType == XMLStreamReader.START_ELEMENT) {
                System.out.println("Start Element:  " + sr.getLocalName());
            }
        }
    }

}

Output on my side:

% javac Demo.java
% java Demo test.xml
class com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
Start Element:  root
End Element:    root
End Document

Ref:

% java --version
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment (build 11.0.14+9-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.14+9-post-Debian-1deb11u1, mixed mode, sharing)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

破晓 2025-01-19 08:25:08

事实证明文档已经描述了:

使用初始事件类型创建 XMLStreamReader 实例
START_DOCUMENT。

因此代码应该是:

% cat Demo.java
import java.io.FileReader;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));
        System.out.println(sr.getClass());

        boolean hasNext;
        do {
            int eventType = sr.getEventType();

            if (eventType == XMLStreamReader.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamReader.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamReader.END_ELEMENT) {
                System.out.println("End Element:    " + sr.getLocalName());
            } else if (eventType == XMLStreamReader.START_ELEMENT) {
                System.out.println("Start Element:  " + sr.getLocalName());
            }
            hasNext = sr.hasNext();
            if(hasNext) sr.next();
        } while( hasNext );
    }
}

使用 XMLEventReader

% cat Demo2.java
import java.io.FileReader;
import javax.xml.stream.*;
import javax.xml.stream.events.*;

public class Demo2 {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLEventReader er = factory.createXMLEventReader(new FileReader("test.xml"));
        System.out.println(er.getClass());

        while(er.hasNext()) {
            XMLEvent xmlEvent = er.nextEvent();
            int eventType = xmlEvent.getEventType();
            if (eventType == XMLStreamConstants.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamConstants.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamConstants.END_ELEMENT) {
                System.out.println("End Element:    " + xmlEvent.asEndElement().getName());
            } else if (eventType == XMLStreamConstants.START_ELEMENT) {
                System.out.println("Start Element:  " + xmlEvent.asStartElement().getName());
            }
        }
    }
}

Turns out the documentation has it described:

An XMLStreamReader instance is created with an initial event type
START_DOCUMENT.

So code should instead be:

% cat Demo.java
import java.io.FileReader;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));
        System.out.println(sr.getClass());

        boolean hasNext;
        do {
            int eventType = sr.getEventType();

            if (eventType == XMLStreamReader.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamReader.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamReader.END_ELEMENT) {
                System.out.println("End Element:    " + sr.getLocalName());
            } else if (eventType == XMLStreamReader.START_ELEMENT) {
                System.out.println("Start Element:  " + sr.getLocalName());
            }
            hasNext = sr.hasNext();
            if(hasNext) sr.next();
        } while( hasNext );
    }
}

The loop is easier to write using XMLEventReader:

% cat Demo2.java
import java.io.FileReader;
import javax.xml.stream.*;
import javax.xml.stream.events.*;

public class Demo2 {

    public static void main(String[] args) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLEventReader er = factory.createXMLEventReader(new FileReader("test.xml"));
        System.out.println(er.getClass());

        while(er.hasNext()) {
            XMLEvent xmlEvent = er.nextEvent();
            int eventType = xmlEvent.getEventType();
            if (eventType == XMLStreamConstants.START_DOCUMENT) {
                System.out.println("Start Document" );
            } else if (eventType == XMLStreamConstants.END_DOCUMENT) {
                System.out.println("End Document" );
            } else if (eventType == XMLStreamConstants.END_ELEMENT) {
                System.out.println("End Element:    " + xmlEvent.asEndElement().getName());
            } else if (eventType == XMLStreamConstants.START_ELEMENT) {
                System.out.println("Start Element:  " + xmlEvent.asStartElement().getName());
            }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文