XML 内の外部エンティティにより、DocumentBuilder.parse(“file”) 中に null ポインター例外が発生します。
-
11-09-2019 - |
質問
DOM パーサーを使用して XML ドキュメントを解析しようとしていました。
doc = builder.parse(xmlDataFile); の実行中に null ポインタ例外が発生しました。
XML データ ファイルにはエンティティがほとんどありませんでした。特定のエンティティを削除すると、ファイルを正常に解析することができました
その実体はこんな感じでした
<!ENTITY SAMPLE.TIF SYSTEM "SAMPLE.TIF" NDATA TIF>
何が原因でしょうか?
編集:
コードは次のとおりです。
DocumentBuilderFactory aFactory = DocumentBuilderFactory.newInstance();
aFactory.setValidating(false);
aFactory.setFeature("http://xml.org/sax/features/namespaces", false);
aFactory.setFeature("http://apache.org/xml/features/validation/schema", false);
aFactory.setIgnoringComments(true);
builder = aFactory.newDocumentBuilder();
doc = builder.parse(xmlDataFile);
これがトレースです:
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.setChunkIndex(DeferredDocumentImpl.java:1944)
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.appendChild(DeferredDocumentImpl.java:644)
at com.sun.org.apache.xerces.internal.parsers.AbstractDOMParser.characters(AbstractDOMParser.java:1191)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.characters(XMLDTDValidator.java:862)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:463)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:180)
at XMLParser.Parse(XMLParser.java:89)
at Main.main(Main.java:116)
89 行番号は -> doc = builder.parse(xmlDataFile); を指します。
解決
解決 。しかし、解決策には何が問題だったのかが記載されていないため、エラーの理由は実際には不明です。:(
他のヒント
これは Xerces のバグであり、バージョン 2.9.1 で修正されています。
所属していません StackOverflow