事象
社内ネットワーク上で、Javaのjavax.xml.parsers.SAXParserを使ってXMLをパースしたかった。
以下、2点ちょっとはまった。
- SAXParserがDTDの検証のためにインターネットに接続しようとしてこける
- XMLコメントの内容をパースしたかったがうまく取れなかった
パースしたかったファイルはiBatisで定義されたSqlMapファイル。
対応
1.SAXParserがインターネットにつながらないとき向けの対応
// パーサファクトリの初期化
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// saxParserがDTDの検証のためにインターネットに接続するのを抑止する。
saxParserFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
この記述でSAXParserがネットワークに接続しようとするのを抑止した。
2.XMLコメントの内容をパースしたい向けの対応
CustomHandler handler = new CustomHandler();
SAXParser saxParser = saxParserFactory.newSAXParser();
// (によるxmlコメントを読み込むために設定)
saxParser.getXMLReader().setProperty("http://xml.org/sax/properties/lexical-handler", handler);
これで、CustomHandler#commentが呼ばれるようになり、コメント文もパース可能になる。
以上。