パッケージ org.opengion.fukurou.xml
クラス HybsXMLHandler
java.lang.Object
org.xml.sax.helpers.DefaultHandler
org.opengion.fukurou.xml.HybsXMLHandler
- すべての実装されたインタフェース:
ContentHandler
,DTDHandler
,EntityResolver
,ErrorHandler
このクラスは、拡張オラクル XDK形式のXMLファイルを処理するハンドラです。
オラクルXDK形式のXMLとは、下記のような ROWSET をトップとする ROW の
集まりで1レコードを表し、各ROWには、カラム名をキーとするXMLになっています。
<ROWSET>
<ROW num="1">
<カラム1>値1</カラム1>
・・・
<カラムn>値n</カラムn>
</ROW>
・・・
<ROW num="n">
・・・
</ROW>
<ROWSET>
この形式であれば、XDK(Oracle XML Developer's Kit)を利用すれば、非常に簡単に
データベースとXMLファイルとの交換が可能です。
XDK(Oracle XML Developer's Kit)
拡張XDK形式とは、ROW 以外に、SQL処理用タグ(EXEC_SQL)を持つ XML ファイルです。
また、登録するテーブル(table)を ROWSETタグの属性情報として付与することができます。
(大文字小文字に注意)
これは、オラクルXDKで処理する場合、無視されますので、同様に扱うことが出来ます。
この、EXEC_SQL は、それそれの XMLデータをデータベースに登録する際に、
SQL処理を自動的に流す為の、SQL文を記載します。
この処理は、イベント毎に実行される為、その配置順は重要です。
このタグは、複数記述することも出来ますが、BODY部には、1つのSQL文のみ記述します。
<ROWSET tableName="XX" >
<EXEC_SQL> 最初に記載して、初期処理(データクリア等)を実行させる。
delete from GEXX where YYYYY
</EXEC_SQL>
<MERGE_SQL> このSQL文で UPDATEして、結果が0件ならINSERTを行います。
update GEXX set AA=[AA] , BB=[BB] where CC=[CC]
</MERGE_SQL>
<ROW num="1">
<カラム1>値1</カラム1>
・・・
<カラムn>値n</カラムn>
</ROW>
・・・
<ROW num="n">
・・・
</ROW>
<EXEC_SQL> 最後に記載して、項目の設定(整合性登録)を行う。
update GEXX set AA='XX' , BB='YY' where CC='ZZ'
</EXEC_SQL>
<ROWSET>
DefaultHandler クラスを拡張している為、通常の処理と同様に、使用できます。
InputSource input = new InputSource( reader );
HybsXMLHandler hndler = new HybsXMLHandler();
SAXParserFactory f = SAXParserFactory.newInstance();
SAXParser parser = f.newSAXParser();
parser.parse( input,hndler );
また、上記の処理そのものを簡略化したメソッド:parse( Reader ) を持っているため、
通常そのメソッドを使用します。
8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
EXEC_SQL は、『;』で複数SQLを実行できます。
これに、属性 exists="0" があれば、最初のSQLを実行し、結果が 0 の場合のみ、
以下のSQLを実行します。
<EXEC_SQL exists="0">
select count(*) from user_tables where table_name=upper('BONUS');
CREATE TABLE BONUS ( ・・・・ )
</EXEC_SQL>
exists="0" があるため、1行目を実行後、結果が一致した場合(=0)は、CREATE TABLE文を実行します。
exists="1" を指定した場合は、(!=0)と同じで、0以外という意味になります。
値の判定は、検索処理後の1行目1列目の値で判定します。
HybsXMLHandler には、TagElementListener をセットすることができます。
これは、ROW 毎に 内部情報を TagElement オブジェクト化し、action( TagElement )
が呼び出されます。この Listener を介して、1レコードずつ処理することが
可能です。
- 導入されたバージョン:
- JDK5.0,
-
フィールドの概要
フィールド修飾子とタイプフィールド説明static final String
このハンドラで取り扱える EXEC_SQLタグの属性 "exists"static final String
このハンドラで取り扱えるタグ名 "EXEC_SQL"static final String
このハンドラで取り扱えるタグ名 "MERGE_SQL"static final String
このハンドラで取り扱えるタグ名 "ROW"static final String
このハンドラで取り扱える ROWタグの属性 "num"static final String
このハンドラのトップタグ名 "ROWSET"static final String
このハンドラで取り扱える ROWSETタグの属性 -
コンストラクタの概要
コンストラクタ -
メソッドの概要
修飾子とタイプメソッド説明void
characters
(char[] buffer, int start, int length) 要素内の文字データの通知を受け取ります。void
endElement
(String namespace, String localName, String qname) 要素の終了通知を受け取ります。void
パース処理を行います。void
setDefaultMap
(Map<String, String> map) TagElement オブジェクトを作成する時の 初期カラム/値を設定します。void
setTagElementListener
(TagElementListener listener) 内部に TagElementListener を登録します。void
startElement
(String namespace, String localName, String qname, Attributes attributes) 要素の開始通知を受け取ります。クラスから継承されたメソッド org.xml.sax.helpers.DefaultHandler
endDocument, endPrefixMapping, error, fatalError, ignorableWhitespace, notationDecl, processingInstruction, resolveEntity, setDocumentLocator, skippedEntity, startDocument, startPrefixMapping, unparsedEntityDecl, warning
クラスから継承されたメソッド java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
インタフェースから継承されたメソッド org.xml.sax.ContentHandler
declaration
-
フィールド詳細
-
ROWSET
このハンドラのトップタグ名 "ROWSET"- 関連項目:
-
ROWSET_TABLE
このハンドラで取り扱える ROWSETタグの属性- 関連項目:
-
ROW
このハンドラで取り扱えるタグ名 "ROW"- 関連項目:
-
ROW_NUM
このハンドラで取り扱える ROWタグの属性 "num"- 関連項目:
-
EXEC_SQL
このハンドラで取り扱えるタグ名 "EXEC_SQL"- 関連項目:
-
EXEC_EXISTS
このハンドラで取り扱える EXEC_SQLタグの属性 "exists"- 関連項目:
-
MERGE_SQL
このハンドラで取り扱えるタグ名 "MERGE_SQL"- 関連項目:
-
-
コンストラクタの詳細
-
HybsXMLHandler
public HybsXMLHandler()デフォルトコンストラクター- 変更履歴:
- 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
-
-
メソッドの詳細
-
parse
パース処理を行います。 通常のパース処理の簡易メソッドになっています。- パラメータ:
reader
- パース処理用のReaderオブジェクト- 変更履歴:
- 8.5.4.2 (2024/01/12) PMD 7.0.0 ExceptionAsFlowControl 対応
-
setTagElementListener
内部に TagElementListener を登録します。 これは、<ROW> タグの endElement 処理毎に呼び出されます。 つまり、行データを取得都度、TagElement オブジェクトを作成し、 この TagElementListener の action( TagElement ) メソッドを呼び出します。 何もセットしない、または、null がセットされた場合は、何もしません。- パラメータ:
listener
- TagElementListenerオブジェクト
-
setDefaultMap
TagElement オブジェクトを作成する時の 初期カラム/値を設定します。 TagElements オブジェクトは、XMLファイルより作成する為、項目(カラム)も XMLファイルのROW属性に持っている項目と値で作成されます。 このカラム名を、外部から初期設定することが可能です。 その場合、ここで登録したカラム順(Mapに、LinkedHashMap を使用した場合) が保持されます。また、ROW属性に存在しないカラムがあれば、値とともに 初期値として設定しておくことが可能です。 なお、ここでのMapは、直接設定していますので、ご注意ください。- パラメータ:
map
- 初期カラムマップ
-
characters
要素内の文字データの通知を受け取ります。 インタフェース ContentHandler 内の characters メソッドをオーバーライドしています。 各文字データチャンクに対して特殊なアクション (ノードまたはバッファへのデータの追加、 データのファイルへの出力など) を実行することができます。- 定義:
characters
インタフェース内ContentHandler
- オーバーライド:
characters
クラス内DefaultHandler
- パラメータ:
buffer
- 文字データ配列start
- 配列内の開始位置length
- 配列から読み取られる文字数- 例外:
SAXException
- 関連項目:
-
startElement
public void startElement(String namespace, String localName, String qname, Attributes attributes) throws SAXException 要素の開始通知を受け取ります。 インタフェース ContentHandler 内の startElement メソッドをオーバーライドしています。 パーサは XML 文書内の各要素の前でこのメソッドを呼び出します。 各 startElement イベントには対応する endElement イベントがあります。 これは、要素が空である場合も変わりません。対応する endElement イベントの前に、 要素のコンテンツ全部が順番に報告されます。 ここでは、タグがレベル3以上の場合は、上位タグの内容として取り扱います。よって、 タグに名前空間が定義されている場合、その属性は削除します。- 定義:
startElement
インタフェース内ContentHandler
- オーバーライド:
startElement
クラス内DefaultHandler
- パラメータ:
namespace
- 名前空間 URIlocalName
- 前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列qname
- 前置修飾子を持つ修飾名。修飾名を使用できない場合は空文字列attributes
- 要素に付加された属性。属性が存在しない場合、空の Attributesオブジェクト- 例外:
SAXException
- 関連項目:
- 変更履歴:
- 8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
-
endElement
要素の終了通知を受け取ります。 インタフェース ContentHandler 内の endElement メソッドをオーバーライドしています。 SAX パーサは、XML 文書内の各要素の終わりにこのメソッドを呼び出します。 各 endElement イベントには対応する startElement イベントがあります。 これは、要素が空である場合も変わりません。- 定義:
endElement
インタフェース内ContentHandler
- オーバーライド:
endElement
クラス内DefaultHandler
- パラメータ:
namespace
- 名前空間 URIlocalName
- 前置修飾子を含まないローカル名。名前空間処理が行われない場合は空文字列qname
- 前置修飾子を持つ XML 1.0 修飾名。修飾名を使用できない場合は空文字列- 例外:
SAXException
- 関連項目:
- 変更履歴:
- 6.4.3.2 (2016/02/19) findBugs. element は、コンストラクタで初期化されません。, 6.9.9.0 (2018/08/20) body の最後の処理の修正。
-