4

StAXSource から DOMResult に変換することで、StAX を使用して XML コンテンツを読み取り、その一部を 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);

スタックトレースの始まりは次のとおりです。

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 のデフォルト実装のバグと考えるべきですか?

4

2 に答える 2

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();
            }
于 2012-12-18T09:03:22.923 に答える
0

SAX を使用することをお勧めします。xmlns = "" でも問題なく動作します。

XMLReader xr = XMLReaderFactory.createXMLReader();
Source source = new SAXSource(xr, new InputSource(reader));
于 2012-12-18T10:22:59.980 に答える