2012-05-23 13 views
5

निम्नलिखित कोड उदाहरण में, मैं एक्सएमएल के एक टुकड़े को पार्स करने के लिए एसटीएक्स पार्सर का उपयोग करता हूं। अगर मैं इसके माध्यम से xml10 चलाता हूं, तो यह अपेक्षा के अनुसार काम करता है। Xml11 स्ट्रिंग (जो xml संस्करण को छोड़कर, वही है) - यह एक NullPointerException फेंकता है। मैं इसे जेडीके 1.6 का उपयोग कर मैक पर चला रहा हूं।एसटीएक्स पार्सर क्यों सोचता है कि यह वैध एक्सएमएल 1.0 है लेकिन 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); 
    } 
} 

स्टैक ट्रेस: ​​

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

आप स्टैक ट्रेस पोस्ट कर सकता:

आप xerces से जार डाउनलोड कर सकते हैं? – SantoshK

+0

जोड़ा गया स्टैक ट्रेस। – Kylar

+1

एक वास्तविक बग की तरह लगता है ... मुझे लगता है कि क्या आप XML1.1 स्ट्रिंग को बदलते हैं: स्थिर स्ट्रिंग xml11 = ""; तो यह ठीक काम करता है। –

उत्तर

3

हाय यह सूर्य/Oracle JDK में टूट stax कार्यान्वयन का एक मामला है, आईबीएम JDK ठीक काम करता है, या आप भी सिर्फ नवीनतम Xerces जार का उपयोग करें और आप कर सकते हैं ठीक हो जाएगा। 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

स्वीकृत, लेकिन अभी भी निराशाजनक :(। मेरे पास ऐप लॉन्च करने पर नियंत्रण नहीं है, और नए जार को एकीकृत करने के लिए एक बड़ा दर्द है। हालांकि, यह सत्यापित करने के लिए कि यह वास्तव में जेडीके में एक बग है। – Kylar

+0

यह एक बग है इसके लिए एक बग प्रविष्टि है? – eis

+0

आह, [यहां] (https://bugs.openjdk.java.net/browse/JDK-8029437) यह है। – eis

संबंधित मुद्दे