Symfoware

Symfowareについての考察blog

Java SAXリーダーでコメントタグの内容を取得する

Java + SAXでコメント部分が読み取れず困ったのでメモ。



通常のサンプル



Java + SAXリーダーでxmlを処理するサンプルはこんな感じになると思います。


  1. import java.io.ByteArrayInputStream;
  2. import javax.xml.parsers.SAXParser;
  3. import javax.xml.parsers.SAXParserFactory;
  4. import org.xml.sax.Attributes;
  5. import org.xml.sax.helpers.DefaultHandler;
  6. public class SAXReaderSample extends DefaultHandler {
  7.     // 要素の開始時の処理
  8.     public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) {
  9.         System.out.println("要素開始:" + qName);
  10.     }
  11.     // 要素の終了時の処理
  12.     public void endElement(String namespaceURI, String localName, String qName) {
  13.         System.out.println("要素終了:" + qName);
  14.     }
  15.     // 文字列の処理
  16.     public void characters(char[] ch, int start, int length) {
  17.         System.out.println("値:" + new String(ch, start, length));
  18.     }
  19.     
  20.     
  21.     public static void main(String args[]) throws Exception {
  22.         
  23.         String xml = "<doc>"
  24.                 + "<tag>タグの内容</tag>"
  25.                 + "<!-- コメントの内容 -->"
  26.                 + "<info>情報の内容</info>"
  27.                 + "</doc>";
  28.                 
  29.             
  30.         SAXParserFactory spf = SAXParserFactory.newInstance();
  31.         SAXParser sp = spf.newSAXParser();
  32.         
  33.         ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
  34.         
  35.         SAXReaderSample sh = new SAXReaderSample();
  36.         sp.parse(in, sh);
  37.     }
  38.     
  39. }




実行してみると


要素開始:doc
要素開始:tag
値:タグの内容
要素終了:tag
要素開始:info
値:情報の内容
要素終了:info
要素終了:doc




見事にコメント部分が読み飛ばされています。
まあ、コメントですから正しい処理なのですが、コメントの文字列が
欲しいパターンがあったので調べてみました。




LexicalHandler



こちらが参考になりました。
SAXでコメントタグを取得する方法
Handling Lexical Events


  1. import java.io.ByteArrayInputStream;
  2. import javax.xml.parsers.SAXParser;
  3. import javax.xml.parsers.SAXParserFactory;
  4. import org.xml.sax.Attributes;
  5. import org.xml.sax.SAXException;
  6. import org.xml.sax.ext.LexicalHandler;
  7. import org.xml.sax.helpers.DefaultHandler;
  8. //http://d.hatena.ne.jp/vh5150/20071114
  9. //https://docs.oracle.com/javase/tutorial/jaxp/sax/events.html
  10. public class SAXReaderSample extends DefaultHandler implements LexicalHandler {
  11.     // 要素の開始時の処理
  12.     public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) {
  13.         System.out.println("要素開始:" + qName);
  14.     }
  15.     // 要素の終了時の処理
  16.     public void endElement(String namespaceURI, String localName, String qName) {
  17.         System.out.println("要素終了:" + qName);
  18.     }
  19.     // 文字列の処理
  20.     public void characters(char[] ch, int start, int length) {
  21.         System.out.println("値:" + new String(ch, start, length));
  22.     }
  23.     
  24.     
  25.     public static void main(String args[]) throws Exception {
  26.         
  27.         String xml = "<doc>"
  28.                 + "<tag>タグの内容</tag>"
  29.                 + "<!-- コメントの内容 -->"
  30.                 + "<info>情報の内容</info>"
  31.                 + "</doc>";
  32.                 
  33.             
  34.         SAXParserFactory spf = SAXParserFactory.newInstance();
  35.         SAXParser sp = spf.newSAXParser();
  36.         
  37.         ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
  38.         
  39.         SAXReaderSample sh = new SAXReaderSample();
  40.         
  41.         // この指定が重要
  42.         sp.setProperty("http://xml.org/sax/properties/lexical-handler", sh);
  43.         
  44.         sp.parse(in, sh);
  45.     }
  46.     
  47.     // --- 以下、LexicalHandlerの実装
  48.     @Override
  49.     public void comment(char[] ch, int start, int length) throws SAXException {
  50.         // ここでコメントが取得できる
  51.         System.out.println("コメント:" + new String(ch, start, length));
  52.     }
  53.     @Override
  54.     public void endCDATA() throws SAXException {
  55.     }
  56.     @Override
  57.     public void endDTD() throws SAXException {
  58.     }
  59.     @Override
  60.     public void endEntity(String arg0) throws SAXException {
  61.     }
  62.     @Override
  63.     public void startCDATA() throws SAXException {
  64.     }
  65.     @Override
  66.     public void startDTD(String arg0, String arg1, String arg2) throws SAXException {
  67.     }
  68.     @Override
  69.     public void startEntity(String arg0) throws SAXException {
  70.     }
  71.     
  72. }




setPropertyの記載が無いと、ちゃんとコメントが取得できません。
これ、いらんだろと思い省略してはまりました。

狙い通りの実行結果です。


要素開始:doc
要素開始:tag
値:タグの内容
要素終了:tag
コメント: コメントの内容
要素開始:info
値:情報の内容
要素終了:info
要素終了:doc



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/08/22(土) 16:20:31|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Apache PDFBox 用紙サイズの指定と用紙の向き(Landscape,Portrait) | ホーム | Eclipse MarsにMercurialプラグインをインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1787-a4bcb2af
この記事にトラックバックする(FC2ブログユーザー)