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