Stax未检测到End元素

时间:2012-08-25 17:16:38

标签: java xml stax

我正在读取与以下相同的XML文件:

<ts>
    <tr comment="" label="tr1">
        <node order="1" label="" />
    </tr>
</ts>

我希望以下代码在屏幕上打印出三个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");
    }
}

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

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

2 个答案:

答案 0 :(得分:5)

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

s
s
s
e
e
e

我不认为它与<node order="1" label="" />有关,因为documentation表示:

  

注意:将报告两个空元素(例如<tag/>)   单独的活动: START_ELEMENT END_ELEMENT - 这会保留解析   空元素与<tag></tag>的等价性。这个方法会抛出一个   IllegalStateException如果在hasNext()返回false后调用它。

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

答案 1 :(得分: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());
            }
        }
    }

}

<强>输出

以下是我得到的输出。

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