2012-05-23 22 views
5

En el siguiente ejemplo de código, uso el analizador STaX para analizar un fragmento de XML. Si ejecuto el xml10 a través de él, funciona como se esperaba. La cadena xml11 (que es la misma, excepto para la versión xml) - arroja una NullPointerException. Estoy ejecutando esto en una Mac usando JDK 1.6.¿Por qué el analizador STAX piensa que esto es válido XML 1.0 pero no 1.1?

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 ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"+ 
         "<anElement/>"; 

    static String xml11 ="<?xml version=\"1.1\" encoding=\"utf-8\" ?>\n"+ 
      "<anElement/>"; 


    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<QName> XMLDEPTH = new Stack<QName>(); 
     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); 
    } 
} 

Seguimiento de la pila:

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) 
+0

Podría publicar el seguimiento de pila? – SantoshK

+0

Se agregó rastro de pila. – Kylar

+1

Parece un error genuino ... Me doy cuenta si cambia la cadena XML1.1 a: static String xml11 = " \ N" + ""; entonces funciona bien –

Respuesta

3

Hola Este es un caso de roto aplicación stax en el Sun/Oracle JDK, IBM JDK funciona bien, o incluso se puede utilizar sólo las últimas Xerces frascos y Estará bien.

Puede descargar xerces frascos de: http://xerces.apache.org/mirrors.cgi#binary

[email protected]:~/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) 
[email protected]:~/test$ java -cp .:xercesImpl.jar:xml-apis.jar StaxSucks 
Starting XML1.0 
Stack is empty:true 
Starting XML1.1 
Stack is empty:true 
+0

Aceptado, pero aún frustrante :(. No tengo control sobre el lanzamiento de la aplicación, y para integrar nuevos contenedores es un dolor masivo. Gracias, sin embargo, por verificar que en realidad es un error en el JDK. – Kylar

+0

if es un error ¿hay una entrada de error para él? – eis

+0

ah, [aquí] (https://bugs.openjdk.java.net/browse/JDK-8029437) es. – eis

Cuestiones relacionadas