2012-05-23 6 views
5

Nell'esempio di codice seguente, utilizzo il parser STaX per analizzare un pezzo di XML. Se eseguo xml10 attraverso di esso, funziona come previsto. La stringa xml11 (che è la stessa, fatta eccezione per la versione xml) - lancia una NullPointerException. Lo sto usando su un Mac usando JDK 1.6.Perché il parser STAX ritiene che questo sia XML 1.0 valido ma non 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); 
    } 
} 

dello stack:

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

puoiaffiggere la traccia dello stack? – SantoshK

+0

Aggiunta traccia dello stack. – Kylar

+1

Sembra un vero bug ... Mi accorgo che cambi la stringa XML1.1 in: static String xml11 = " \ N" + ""; allora funziona bene. –

risposta

3

Hi Si tratta di un caso di attuazione Stax spezzato in the Sun/Oracle JDK, IBM JDK funziona bene, o si può anche semplicemente usare le ultime Xerces vasetti e si andrà bene.

È possibile scaricare xerces vasetti da: 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

Accettato, ma ancora frustrante :(. Non ho il controllo sul lancio della app, e per integrare nuovi giare è un enorme dolore.Grazie, però, per verificare che sia effettivamente un bug nel JDK. – Kylar

+0

se è un bug c'è una voce di bug per questo? – eis

+0

ah, [qui] (https://bugs.openjdk.java.net/browse/JDK-8029437) lo è. – eis

Problemi correlati