【问题标题】:Transforming from Stax to DOM results in NullPointerException从 Stax 转换为 DOM 导致 NullPointerException
【发布时间】:2012-12-05 10:38:55
【问题描述】:

我正在使用 StAX 读取 XML 内容,并通过从 StAXSource 转换为 DOMResult 将其部分解析为 DOM 片段。但是,当任何元素重新定义默认 XML 命名空间 (xmlns="") 时,这会导致 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);

stacktrace 的开头是:

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 默认实现中的错误?

【问题讨论】:

    标签: java stax


    【解决方案1】:

    使用有效的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();
                }
    

    【讨论】:

      【解决方案2】:

      我建议使用 SAX,即使使用 xmlns = ""

      也能正常工作
      XMLReader xr = XMLReaderFactory.createXMLReader();
      Source source = new SAXSource(xr, new InputSource(reader));
      

      【讨论】:

        猜你喜欢
        • 2011-05-02
        • 2016-07-07
        • 2015-01-13
        • 2011-08-19
        • 2012-07-05
        • 2016-03-07
        • 2017-05-16
        • 1970-01-01
        • 2014-06-09
        相关资源
        最近更新 更多