为什么STAX解析器认为这是有效的XML 1.0而不是1.1?

在下面的代码示例中,我使用STaX解析器来解析一段XML。 如果我通过它运行xml10,它按预期工作。 xml11字符串(除了xml版本之外是相同的) – 它会抛出NullPointerException。 我在使用JDK 1.6的Mac上运行它。

import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringReader; import java.util.Stack; /** */ public class StaxSucks { static String xml10 ="\n"+ ""; static String xml11 ="\n"+ ""; static void parse(InputStream is) throws Exception{ final XMLInputFactory factory = XMLInputFactory.newInstance(); factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); final XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(is); Stack XMLDEPTH = new Stack(); int eventType = xmlStreamReader.next(); while(eventType != XMLStreamConstants.END_DOCUMENT){ if(XMLStreamConstants.START_ELEMENT == eventType){ QName eventName = xmlStreamReader.getName(); XMLDEPTH.push(eventName); }else if(XMLStreamConstants.END_ELEMENT == eventType){ //ends should always match the starts. QName eventName = xmlStreamReader.getName(); if(XMLDEPTH.peek().equals(eventName)){ XMLDEPTH.pop(); }else{ System.out.println("Hit an end with a non-matching beginning:"+eventName); } } else{ System.out.println("Hit event type:"+eventType); } eventType = xmlStreamReader.next(); } System.out.println("Stack is empty:"+XMLDEPTH.empty()); } public static void main(String[] args) throws Exception{ System.out.println("Starting XML1.0"); InputStream is = new ByteArrayInputStream(xml10.getBytes("utf8")); parse(is); System.out.println("Starting XML1.1"); is = new ByteArrayInputStream(xml11.getBytes("utf8")); parse(is); } } 

堆栈跟踪:

 Exception in thread "main" java.lang.NullPointerException at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.scanStartElement(XML11NSDocumentScannerImpl.java:351) at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl$NS11ContentDriver.scanRootElementHook(XML11NSDocumentScannerImpl.java:889) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.next(XML11NSDocumentScannerImpl.java:852) at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:554) at StaxSucks.parse(StaxSucks.java:46) at StaxSucks.main(StaxSucks.java:74) 

嗨这是Sun / Oracle JDK中断stax实现的情况,IBM JDK工作正常,或者你甚至可以使用最新的Xerces jar,你会没事的。

您可以从http://xerces.apache.org/mirrors.cgi#binary下载xerces jars

 dims@dims-laptop-520:~/test$ /usr/lib/jvm/java-6-sun/bin/java -cp . StaxSucks Starting XML1.0 Stack is empty:true Starting XML1.1 Exception in thread "main" java.lang.NullPointerException at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.scanStartElement(XML11NSDocumentScannerImpl.java:351) at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl$NS11ContentDriver.scanRootElementHook(XML11NSDocumentScannerImpl.java:889) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.next(XML11NSDocumentScannerImpl.java:852) at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:554) at StaxSucks.parse(StaxSucks.java:26) at StaxSucks.main(StaxSucks.java:54) dims@dims-laptop-520:~/test$ java -cp .:xercesImpl.jar:xml-apis.jar StaxSucks Starting XML1.0 Stack is empty:true Starting XML1.1 Stack is empty:true