パッケージ org.opengion.fukurou.xml

## クラス JspSaxParser

- java.lang.Object
- - org.xml.sax.helpers.DefaultHandler
  - - org.xml.sax.ext.DefaultHandler2
    - - org.opengion.fukurou.xml.JspSaxParser

- すべての実装されたインタフェース:
    `org.xml.sax.ContentHandler`, `org.xml.sax.DTDHandler`, `org.xml.sax.EntityResolver`, `org.xml.sax.ErrorHandler`, `org.xml.sax.ext.DeclHandler`, `org.xml.sax.ext.EntityResolver2`, `org.xml.sax.ext.LexicalHandler`

      public class JspSaxParser
      extends org.xml.sax.ext.DefaultHandler2

  JSP/XMLファイルを読み取って、OGNode/OGElement オブジェクトを取得する、パーサークラスです。 自分自身が、DefaultHandler2 を拡張していますので、パーサー本体になります。 javax.xml.parsers および、org.w3c.dom の簡易処理を行います。 read で、トップレベルの OGNode を読み込み、write で、ファイルに書き出します。 通常の W3C 系の オブジェクトを利用しないのは、属性の並び順を保障するためです。 ただし、属性のタブ、改行は失われます。 また、属性値に含まれるCR(復帰), LF(改行), TAB(タブ)は、 半角スペースに置き換えられます。 これは、SAXParser 側での XML の仕様の関係で、属性は、正規化されるためです。
  変更履歴:
    5.1.8.0 (2010/07/01) 新規作成, 5.1.9.0 (2010/08/01) static メソッドを廃止。通常のオブジェクトクラスとして扱います。
  バージョン
    5.0
  作成者
    Kazuhiko Hasegawa
  導入されたバージョン:
    JDK6.0,

- - ### コンストラクタの概要

    コンストラクタ
    コンストラクタ | 説明
    --- | ---
    `JspSaxParser()` |

  - ### メソッドの概要

    すべてのメソッド staticメソッド インスタンス・メソッド concreteメソッド
    修飾子とタイプ | メソッド | 説明
    --- | --- | ---
    `void` | `addFilter​(JspParserFilter filter)` | copyDirectry 処理で、OGDocument をフィルター処理するオブジェクトを登録します。
    `void` | `characters​(char[] cbuf, int off, int len)` | 要素内の文字データの通知を受け取ります。
    `void` | `comment​(char[] cbuf, int off, int len)` | 文書内の任意の位置にある XML コメントを報告します。
    `void` | `copyDirectry​(java.io.File fromFile, java.io.File toFile)` | ディレクトリの再帰処理でパース処理を行います。
    `void` | `endCDATA()` | CDATA セクションの終わりを報告します。
    `void` | `endDTD()` | DTD 宣言の終わりを報告します。
    `void` | `endElement​(java.lang.String uri, java.lang.String localName, java.lang.String qName)` | 要素の終了通知を受け取ります。
    `void` | `endEntity​(java.lang.String name)` | エンティティーの終わりを報告します。
    `void` | `ignorableWhitespace​(char[] cbuf, int off, int len)` | 要素コンテンツに含まれる無視できる空白文字の通知を受け取ります。
    `static void` | `main​(java.lang.String[] args)` | サンプルプログラムです。
    `OGDocument` | `read​(java.io.File aFile)` | XMLファイルを読み込み、OGDocument を返します。
    `void` | `startCDATA()` | CDATA セクションの開始を報告します。
    `void` | `startDocument()` | 文書の開始通知を受け取ります。
    `void` | `startDTD​(java.lang.String name, java.lang.String publicId, java.lang.String systemId)` | DTD 宣言がある場合、その開始を報告します。
    `void` | `startElement​(java.lang.String uri, java.lang.String localName, java.lang.String qName, org.xml.sax.Attributes attributes)` | 要素の開始通知を受け取ります。
    `void` | `startEntity​(java.lang.String name)` | 内部および外部の XML エンティティーの一部の開始を報告します。
    `OGDocument` | `string2Node​(java.lang.String str)` | XML形式で表現された、文字列(String) から、OGDocument を構築します。
    `void` | `warning​(org.xml.sax.SAXParseException ex)` | パーサー警告の通知を受け取ります。
    `void` | `write​(java.io.File aFile, OGDocument node)` | OGDocument を所定のファイルに、XML形式で書き出します。

    - ### クラスから継承されたメソッド org.xml.sax.ext.DefaultHandler2

      `attributeDecl, elementDecl, externalEntityDecl, getExternalSubset, internalEntityDecl, resolveEntity, resolveEntity`

    - ### クラスから継承されたメソッド org.xml.sax.helpers.DefaultHandler

      `endDocument, endPrefixMapping, error, fatalError, notationDecl, processingInstruction, setDocumentLocator, skippedEntity, startPrefixMapping, unparsedEntityDecl`

    - ### クラスから継承されたメソッド java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### コンストラクタの詳細

    - #### JspSaxParser

          public JspSaxParser()

  - ### メソッドの詳細

    - #### read

          public OGDocument read​(java.io.File aFile)

      XMLファイルを読み込み、OGDocument を返します。 内部的には、SAXParserFactory から、SAXParser を構築し、Property に、 http://xml.org/sax/properties/lexical-handler を設定しています。 コメントノードを処理するためです。
      パラメータ:
        `aFile` - XMLファイル
      戻り値:
        ファイルから読み取って構築したOGDocumentオブジェクト
      変更履歴:
        5.1.9.0 (2010/08/01) static からノーマルに変更
      このメソッドは、nullを返しません

    - #### string2Node

          public OGDocument string2Node​(java.lang.String str)

      XML形式で表現された、文字列(String) から、OGDocument を構築します。 処理的には、#read( File ) と同じで、取り出す元が、文字列というだけです。 XMLファイルからの読み込みと異なり、通常は、Element を表現した文字列が作成されますが、 返されるのは、OGDocument オブジェクトです。
      パラメータ:
        `str` - XML形式で表現された文字列
      戻り値:
        ファイルから読み取って構築した OGDocumentオブジェクト
      変更履歴:
        5.1.9.0 (2010/08/01) static からノーマルに変更
      このメソッドは、nullを返しません

    - #### write

          public void write​(java.io.File aFile,
                            OGDocument node)

      OGDocument を所定のファイルに、XML形式で書き出します。
      パラメータ:
        `aFile` - 書き出すファイル
        `node` - 書き出す OGDocument
      変更履歴:
        6.3.8.0 (2015/09/11) FileUtil#getPrintWriter( File,String ) を使用。

    - #### copyDirectry

          public void copyDirectry​(java.io.File fromFile,
                                   java.io.File toFile)

      ディレクトリの再帰処理でパース処理を行います。
      パラメータ:
        `fromFile` - 読み取りもとのファイル/フォルダ
        `toFile` - 書き込み先のファイル/フォルダ
      変更履歴:
        5.1.9.0 (2010/08/01) static からノーマルに変更

    - #### addFilter

          public void addFilter​(JspParserFilter filter)

      copyDirectry 処理で、OGDocument をフィルター処理するオブジェクトを登録します。 内部リストへフィルターを追加します。 フィルター処理は、追加された順に行われます。 内部リストへの追加はできますが、削除はできません。
      パラメータ:
        `filter` - フィルターオブジェクト
      変更履歴:
        5.1.9.0 (2010/08/01) 新規追加

    - #### startDocument

          public void startDocument()

      文書の開始通知を受け取ります。 インタフェース ContentHandler 内の startDocument
      定義:
        `startDocument` インタフェース内 `org.xml.sax.ContentHandler`
      オーバーライド:
        `startDocument` クラス内 `org.xml.sax.helpers.DefaultHandler`
      関連項目:
        `DefaultHandler.startDocument()`, `ContentHandler.startDocument()`
      変更履歴:
        6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。

    - #### startElement

          public void startElement​(java.lang.String uri,
                                   java.lang.String localName,
                                   java.lang.String qName,
                                   org.xml.sax.Attributes attributes)

      要素の開始通知を受け取ります。 インタフェース ContentHandler 内の startElement
      定義:
        `startElement` インタフェース内 `org.xml.sax.ContentHandler`
      オーバーライド:
        `startElement` クラス内 `org.xml.sax.helpers.DefaultHandler`
      パラメータ:
        `uri` - 名前空間 ＵＲＩ。要素が名前空間 ＵＲＩ を持たない場合、または名前空間処理が実行されない場合は null
        `localName` - 前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列
        `qName` - 接頭辞を持つ修飾名。修飾名を使用できない場合は空文字列
        `attributes` - 要素に付加された属性。属性が存在しない場合、空の Attributesオブジェクト
      関連項目:
        `DefaultHandler.startElement(String,String,String,Attributes)`, `ContentHandler.startElement(String,String,String,Attributes)`

    - #### characters

          public void characters​(char[] cbuf,
                                 int off,
                                 int len)

      要素内の文字データの通知を受け取ります。 エンティティー内かどうかを判断する、inEntity フラグが true の間は、 何も処理しません。 インタフェース ContentHandler 内の characters
      定義:
        `characters` インタフェース内 `org.xml.sax.ContentHandler`
      オーバーライド:
        `characters` クラス内 `org.xml.sax.helpers.DefaultHandler`
      パラメータ:
        `cbuf` - 文字データ配列
        `off` - 文字配列内の開始位置
        `len` - 文字配列から使用される文字数
      関連項目:
        `DefaultHandler.characters(char[],int,int)`, `ContentHandler.characters(char[],int,int)`

    - #### startCDATA

          public void startCDATA()

      CDATA セクションの開始を報告します。 CDATA セクションのコンテンツは、正規の characters イベントを介して報告されます。 このイベントは境界の報告だけに使用されます。 インタフェース LexicalHandler 内の startCDATA
      定義:
        `startCDATA` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `startCDATA` クラス内 `org.xml.sax.ext.DefaultHandler2`
      関連項目:
        `DefaultHandler2.startCDATA()`, `LexicalHandler.startCDATA()`

    - #### endCDATA

          public void endCDATA()

      CDATA セクションの終わりを報告します。 インタフェース LexicalHandler 内の endCDATA
      定義:
        `endCDATA` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `endCDATA` クラス内 `org.xml.sax.ext.DefaultHandler2`
      関連項目:
        `DefaultHandler2.endCDATA()`, `LexicalHandler.endCDATA()`

    - #### startDTD

          public void startDTD​(java.lang.String name,
                               java.lang.String publicId,
                               java.lang.String systemId)

      DTD 宣言がある場合、その開始を報告します。 start/endDTD イベントは、ContentHandler の start/endDocument イベント内の最初の startElement イベントの前に出現します。 インタフェース LexicalHandler 内の startDTD
      定義:
        `startDTD` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `startDTD` クラス内 `org.xml.sax.ext.DefaultHandler2`
      パラメータ:
        `name` - 文書型名
        `publicId` - 宣言された外部 DTD サブセットの公開識別子。 宣言されていない場合は null
        `systemId` - 宣言された外部 DTD サブセットのシステム識別子。 宣言されていない場合は null。 ドキュメントのベース URI に対しては解決されないことに 注意すること
      関連項目:
        `DefaultHandler2.startDTD( String , String , String )`, `LexicalHandler.startDTD( String , String , String )`

    - #### endDTD

          public void endDTD()

      DTD 宣言の終わりを報告します。 このメソッドは、DOCTYPE 宣言の終わりを報告するメソッドです。 ここでは、何もしません。 インタフェース LexicalHandler 内の endDTD
      定義:
        `endDTD` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `endDTD` クラス内 `org.xml.sax.ext.DefaultHandler2`
      関連項目:
        `DefaultHandler2.endDTD()`, `LexicalHandler.endDTD()`

    - #### startEntity

          public void startEntity​(java.lang.String name)

      内部および外部の XML エンティティーの一部の開始を報告します。 インタフェース LexicalHandler の記述: ※ ここでは、&lt; などの文字列が、lt という名のエンティティーで 報告されるため、元の＆付きの文字列に復元しています。 エンティティー内かどうかを判断する、inEntity フラグを true にセットします。 inEntity=true の間は、#characters(char[],int,int) は、何も処理しません。
      定義:
        `startEntity` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `startEntity` クラス内 `org.xml.sax.ext.DefaultHandler2`
      パラメータ:
        `name` - エンティティーの名前
      関連項目:
        `LexicalHandler.startEntity(String)`

    - #### endEntity

          public void endEntity​(java.lang.String name)

      エンティティーの終わりを報告します。 インタフェース LexicalHandler の記述: ※ ここでは、inEntity=false を設定するだけです。
      定義:
        `endEntity` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `endEntity` クラス内 `org.xml.sax.ext.DefaultHandler2`
      パラメータ:
        `name` - エンティティーの名前
      関連項目:
        `LexicalHandler.endEntity(String)`

    - #### ignorableWhitespace

          public void ignorableWhitespace​(char[] cbuf,
                                          int off,
                                          int len)

      要素コンテンツに含まれる無視できる空白文字の通知を受け取ります。 インタフェース ContentHandler 内の ignorableWhitespace
      定義:
        `ignorableWhitespace` インタフェース内 `org.xml.sax.ContentHandler`
      オーバーライド:
        `ignorableWhitespace` クラス内 `org.xml.sax.helpers.DefaultHandler`
      パラメータ:
        `cbuf` - 文字データ配列(空白文字)
        `off` - 文字配列内の開始位置
        `len` - 文字配列から使用される文字数
      関連項目:
        `ContentHandler.ignorableWhitespace(char[],int,int)`

    - #### comment

          public void comment​(char[] cbuf,
                              int off,
                              int len)

      文書内の任意の位置にある XML コメントを報告します。 インタフェース LexicalHandler の記述:
      定義:
        `comment` インタフェース内 `org.xml.sax.ext.LexicalHandler`
      オーバーライド:
        `comment` クラス内 `org.xml.sax.ext.DefaultHandler2`
      パラメータ:
        `cbuf` - 文字データ配列(コメント文字)
        `off` - 配列内の開始位置
        `len` - 配列から読み取られる文字数
      関連項目:
        `DefaultHandler.characters(char[],int,int)`

    - #### endElement

          public void endElement​(java.lang.String uri,
                                 java.lang.String localName,
                                 java.lang.String qName)

      要素の終了通知を受け取ります。
      定義:
        `endElement` インタフェース内 `org.xml.sax.ContentHandler`
      オーバーライド:
        `endElement` クラス内 `org.xml.sax.helpers.DefaultHandler`
      パラメータ:
        `uri` - 名前空間 ＵＲＩ。要素が名前空間 ＵＲＩ を持たない場合、または名前空間処理が実行されない場合は null
        `localName` - 前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列
        `qName` - 接頭辞を持つ修飾名。修飾名を使用できない場合は空文字列
      関連項目:
        `DefaultHandler.endElement(String,String,String)`, `ContentHandler.endElement(String,String,String)`

    - #### warning

          public void warning​(org.xml.sax.SAXParseException ex)

      パーサー警告の通知を受け取ります。 インタフェース org.xml.sax.ErrorHandler 内の warning ここでは、パーサー警告の内容を標準エラーに表示します。
      定義:
        `warning` インタフェース内 `org.xml.sax.ErrorHandler`
      オーバーライド:
        `warning` クラス内 `org.xml.sax.helpers.DefaultHandler`
      パラメータ:
        `ex` - 例外として符号化された警告情報
      関連項目:
        `ErrorHandler.warning(SAXParseException)`

    - #### main

          public static void main​(java.lang.String[] args)
                           throws java.lang.ReflectiveOperationException,
                                  java.lang.NoSuchMethodException,
                                  java.lang.reflect.InvocationTargetException

      サンプルプログラムです。 引数の IN がファイルの場合は、OUTもファイルとして扱います。 IN がフォルダの場合は、階層にしたがって、再帰的に処理を行い、OUT に出力します。 フォルダ階層をパースしている最中に、XMLとして処理できない、処理中にエラーが発生した などの場合は、バイナリコピーを行います。 "Usage: org.opengion.fukurou.xml.JspSaxParser <inFile|inDir> <outFile|outDir> [<JspParserFilter1> ･･･ ]"
      パラメータ:
        `args` - コマンド引数配列
      例外:
        `java.lang.ClassNotFoundException` - クラスが見つからない場合
        `java.lang.InstantiationException` - インスタンスを生成できなかった場合
        `java.lang.IllegalAccessException` - 不正なアクセスがあった場合
        `java.lang.NoSuchMethodException` - 特定のメソッドが見つからない
        `java.lang.reflect.InvocationTargetException` - 呼び出されるメソッドまたはコンストラクタがスローする例外をラップする、チェック済み例外
        `java.lang.ReflectiveOperationException`
      変更履歴:
        6.3.9.1 (2015/11/27) A method/constructor shouldnt explicitly throw java.lang.Exception(PMD)。, 6.4.3.3 (2016/03/04) リフレクション系の例外の共通クラスに置き換えます。, 6.8.2.3 (2017/11/10) java9対応(cls.newInstance() → cls.getDeclaredConstructor().newInstance())