Stax未检测到End元素

mas*_*oud 4 java xml stax

我正在读一个XML文件,如下所示:

<ts>
    <tr comment="" label="tr1">
        <node order="1" label="" />
    </tr>
</ts>
Run Code Online (Sandbox Code Playgroud)

我希望下面的代码e在屏幕上打印出三个:

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));

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

    if (eventType == XMLStreamReader.START_DOCUMENT) {
        continue;
    } else if (eventType == XMLStreamReader.END_ELEMENT) {
        System.out.println("e");
    } else if (eventType == XMLStreamReader.START_ELEMENT) {
        System.out.println("s");
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用!关于如何解决这个问题的任何想法?

注意:我认为它与自闭合标签有关,例如: <myTag id="1" />

jua*_*rro 5

我在Windows上使用JDK 1.7并获得与Blaise Doughan相同的结果:

s
s
s
e
e
e
Run Code Online (Sandbox Code Playgroud)

我不认为它与做<node order="1" label="" />,因为文件指出:

注意:<tag/>将使用两个单独的事件报告空元素(例如):START_ELEMENT,END_ELEMENT - 这将保留解析空元素的等效性<tag></tag>.返回false IllegalStateException后,此方法将抛出一个 if hasNext().

远射:也许一些其他相关的代码可能会导致奇怪的行为?


bdo*_*han 3

e您问题中发布的代码为我生成了预期的三个。我在 Mac 上使用 JDK 1.6。

演示

您可能需要尝试运行以下代码来查看缺少哪个结束元素事件:

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

}
Run Code Online (Sandbox Code Playgroud)

输出

下面是我得到的输出。

class com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
Start Element:  ts
Start Element:  tr
Start Element:  node
End Element:    node
End Element:    tr
End Element:    ts
Run Code Online (Sandbox Code Playgroud)