我正在读一个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" />
我在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>.返回falseIllegalStateException后,此方法将抛出一个 ifhasNext().
远射:也许一些其他相关的代码可能会导致奇怪的行为?
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)