2012-12-18 35 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)); 
相关问题