end元素

lhcgjxsq  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(362)

我正在读取一个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" />

a0zr77ik

a0zr77ik1#

你问题中的代码产生了三个 e 对我来说这是意料之中的。我在mac上使用JDK1.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
vngu2lb8

vngu2lb82#

我在windows上使用JDK1.7,得到的结果与blaise doughan相同:

s
s
s
e
e
e

我不认为这和 <node order="1" label="" /> 因为文件规定:
注意:空元素(例如 <tag/> )将报告两个单独的事件:start\u element,end\u element-这将保留空元素到的解析等价性 <tag></tag> . 此方法将抛出 IllegalStateException 如果它被召唤 hasNext() 返回false。
很可能是其他相关的代码导致了这种奇怪的行为?

相关问题