निम्नलिखित कोड उदाहरण में, मैं एक्सएमएल के एक टुकड़े को पार्स करने के लिए एसटीएक्स पार्सर का उपयोग करता हूं। अगर मैं इसके माध्यम से 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)
आप स्टैक ट्रेस पोस्ट कर सकता:
आप xerces से जार डाउनलोड कर सकते हैं? – SantoshK
जोड़ा गया स्टैक ट्रेस। – Kylar
एक वास्तविक बग की तरह लगता है ... मुझे लगता है कि क्या आप XML1.1 स्ट्रिंग को बदलते हैं: स्थिर स्ट्रिंग xml11 = " Xml संस्करण = \" 1.1 \ "एन्कोडिंग = \" utf-8 \ "? \ N" + " "; तो यह ठीक काम करता है। –