2012-12-18 97 views
3

我正在使用StAX來讀取XML內容並通過從StAXSource轉換爲DOMResult將其中的一部分解析爲DOM片段。但是,如果任何元素重新定義默認的XML名稱空間(xmlns =「」),則會導致NullPointerException。最少的代碼來演示情況:從Stax轉換爲DOM會導致NullPointerException

String xml = 
    "<?xml version=\"1.0\"?>"+ 
    "<document>"+ 
    " <element xmlns=\"\" />"+ 
    "</document>"; 

StringReader reader = new StringReader(xml); 
XMLInputFactory xif = XMLInputFactory.newFactory(); 
XMLStreamReader xsr = xif.createXMLStreamReader(reader); 

TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer t = tf.newTransformer(); 

StAXSource source = new StAXSource(xsr); 
DOMResult result = new DOMResult(); 

t.transform(source,result); 

堆棧跟蹤的開頭是:

Caused by: java.lang.NullPointerException 
    at com.sun.org.apache.xml.internal.serializer.NamespaceMappings.pushNamespace(NamespaceMappings.java:233) 
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.startPrefixMapping(ToXMLSAXHandler.java:362)... 

在我的理解中輸入XML是有效的。 Woodstox實現可以毫無問題地轉換XML,但是如果有方法配置或者解決與Java捆綁的默認實現的問題,我不希望爲我的應用添加更多的依賴關係。有什麼辦法嗎?或者這應該被認爲是Java默認實現中的錯誤?

回答

0

使用有效的XML文件

試圖改變你的代碼

XMLInputFactory xif = XMLInputFactory.newInstance(); 
      XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("test.xml")); 
      xsr.nextTag(); 

      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer t = tf.newTransformer(); 
      while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) { 
       DOMResult result = new DOMResult(); 
       t.transform(new StAXSource(xsr), result); 
       Node domNode = result.getNode(); 
      } 
0

我建議使用SAX,即使對那些的xmlns = 「」

XMLReader xr = XMLReaderFactory.createXMLReader(); 
Source source = new SAXSource(xr, new InputSource(reader)); 
相關問題