5

我正在读取与以下相同的 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" />

4

2 回答 2

5

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

s
s
s
e
e
e

我认为这与文档无关,<node order="1" label="" />因为文档指出:

注意:空元素(例如<tag/>)将通过两个单独的事件报告:START_ELEMENTEND_ELEMENT - 这将保留空元素的解析等效性<tag></tag>IllegalStateException如果在hasNext()返回 false后调用此方法,则会抛出一个 。

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

于 2012-08-25T17:30:51.043 回答
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
于 2012-08-25T17:21:14.593 回答