...

ユーティリティ機能利用ガイド

by user

on
Category: Documents
38

views

Report

Comments

Transcript

ユーティリティ機能利用ガイド
FW
ユーティリティ機能利用ガイド
Version 2.1
All Right Reserved, Copyright
i
© FUJITSU LIMITED 2006-2015
改訂履歴
改訂 No.
1
日付
2012/09/27
Version
1.0
章 No.
3
4
6
2
2013/09/27
1.1
3
4
5
2014/01/17
2014/1/28
2014/6/20
1.2
1.3
1.4
6
2014/10/09
1.5
5
7
8
2015/04/02
2015/10/29
2.0
2.1
全般
項 No.
-
改訂内容
新規作成
BASE64 エンコード/デコード機能の追加
ファイル暗号化機能の追加
XML の順次読込機能の追加
バイナリの BASE64 エンコード/デコード機能の追加
ファイル暗号化機能の削除
・記述例を見直し
・章番号を修正
業務公開用クラスのパッケージ名、クラス名見直し
FW リファクタリング
All Right Reserved, Copyright
ii
© FUJITSU LIMITED 2006-2015
第 5 章 XML の順次読込機能 ....................................................................................................................................... 14
5.1 概要 ................................................................................................................................................................................................................................... 14
5.2 処理フローイメージ..................................................................................................................................................................................................... 14
5.3 クラス詳細 ...................................................................................................................................................................................................................... 15
5.3.1 XMLParser .............................................................................................................................................. 15
5.3.2 XMLNodeType ........................................................................................................................................ 15
5.3.3 XMLEventAdapter.................................................................................................................................. 15
5.4 XML→Object 変換イメージ ..................................................................................................................................................................................... 16
5.5 実装例 .............................................................................................................................................................................................................................. 17
目次
第 1 章 はじめに ................................................................................................................................................................... 4
第 2 章 文字列編集 ............................................................................................................................................................. 5
2.1 全角カタカナをひらがなに変換する...................................................................................................................................................................... 5
2.2 ひらがなを全角カタカナに変換する...................................................................................................................................................................... 5
2.3 全角文字を半角文字に変換する ........................................................................................................................................................................... 5
2.4 半角文字を全角文字に変換する ........................................................................................................................................................................... 5
2.5 半角カナ拗音・促音等を通常の文字に変換する ........................................................................................................................................... 5
2.6 全銀カナの不正な濁音を変換する ....................................................................................................................................................................... 5
2.7 文字列を結合する ........................................................................................................................................................................................................ 6
2.8 文字列を ShiftJIS に変換した時の byte 数で分割する ............................................................................................................................... 6
2.9 指定された文字列を検索し, 最初に見つかった文字列を置き換える .................................................................................................. 6
2.10 指定された文字列を検索し, 最初に見つかった文字列を置き換える ................................................................................................ 6
2.11 指定された文字列を検索し, 見つかった文字列すべてを置き換える ................................................................................................ 6
2.12 指定された文字列を検索し, 見つかったすべての文字列の先頭文字のインデックスを配列で返す .................................. 6
2.13 整数を, 指定された文字数の符号無し固定長文字列に変換する ...................................................................................................... 7
2.14 整数を, 指定された文字数の符号付固定長文字列に変換する .......................................................................................................... 7
2.15 半角文字列を, 指定された文字数の固定長文字列に変換する .......................................................................................................... 7
2.16 文字列を指定された長さに変換する ................................................................................................................................................................. 7
2.17 文字列を指定された長さに変換する ................................................................................................................................................................. 7
2.18 文字列を指定された長さに変換する(文字列左側にパディング) ........................................................................................................ 7
2.19 文字列を指定された長さに変換する(文字列右側にパディング) ........................................................................................................ 8
2.20 全角文字列を, 指定された文字数の固定長文字列に変換する .......................................................................................................... 8
2.21 文字列の前方空白を削除する ............................................................................................................................................................................. 8
2.22 文字列の後方空白を削除する ............................................................................................................................................................................. 8
2.23 文字列を char で分割する ...................................................................................................................................................................................... 8
2.24 文字列を String で分割する................................................................................................................................................................................... 8
2.25 文字列に指定された文字数分, 指定された文字を追加する ................................................................................................................. 9
2.26 文字列に指定された文字数分, 全角スペースを追加する...................................................................................................................... 9
2.27 文字列に指定された文字数分, 半角スペースを追加する...................................................................................................................... 9
第 3 章 文字列チェック .................................................................................................................................................... 10
3.1 指定の文字が Shift-JIS で 1byte であるか判定する................................................................................................................................. 10
3.2 文字列がすべてアルファベットで構成されているか判定する................................................................................................................. 10
3.3 文字列が null もしくは空文字かどうか判定する ......................................................................................................................................... 10
3.4 文字が半角のカタカナ文字か判定する ............................................................................................................................................................ 10
3.5 文字列がすべて半角のカタカナ文字で構成されているか判定する .................................................................................................... 10
3.6 文字列がすべてひらがなで構成されているか判定する ........................................................................................................................... 10
3.7 文字列がすべて半角文字で構成されているか判定する ......................................................................................................................... 11
3.8 文字列がすべて数字で構成されているか判定する ................................................................................................................................... 11
3.9 文字列がすべて全角文字で構成されているか判定する ......................................................................................................................... 11
3.10 文字列がすべて全角のカタカナ文字で構成されているか判定する ................................................................................................. 11
3.11 指定された文字列が Java 識別子として指定可能か判定する ........................................................................................................... 11
3.12 文字列がすべて全銀カナ文字で構成されているか判定する .............................................................................................................. 11
第 4 章 BASE64エンコード/デコード ....................................................................................................................... 12
4.1 BASE64エンコードする............................................................................................................................................................................................. 12
4.2 BASE64デコードする................................................................................................................................................................................................. 12
4.3 バイナリを BASE64エンコードする .................................................................................................................................................................... 13
4.4 バイナリを BASE64デコードする ........................................................................................................................................................................ 13
All Right Reserved, Copyright
iii
© FUJITSU LIMITED 2006-2015
第1章 はじめに
本書は FW が提供する各種ユーティリティ機能についての説明書です。
機能の詳細については、各種 javadoc を参照してください。
All Right Reserved, Copyright
4
© FUJITSU LIMITED 2006-2015
第2章 文字列編集
2.5 半角カナ拗音・促音等を通常の文字に変換する
2.1 全角カタカナをひらがなに変換する
StringConverter.toBigKatakana()メソッドを使用します。
StringConverter.toHiragana()メソッドを使用します。
static String toBigKatakana(String str)
static String toHiragana(String str)
実装例
実装例
String str = StringConverter.toBigKatakana("ァィゥェォ");
String str = StringConverter.toHiragana("アイウエオ");
変数 str のコンソール出力結果:
変数 str のコンソール出力結果:
アイウエオ
あいうえお
2.6 全銀カナの不正な濁音を変換する
2.2 ひらがなを全角カタカナに変換する
StringConverter.toZenginKanaSonant()メソッドを使用します。
StringConverter.toKatakana()メソッドを使用します。
static String toZenginKanaSonant(String str)
static String toKatakana(String str)
実装例
実装例
String str = StringConverter.toZenginKanaSonant("ア゙");
String str = StringConverter.toKatakana("あいうえお");
変数 str のコンソール出力結果:
変数 str のコンソール出力結果:
ア
アイウエオ
2.3 全角文字を半角文字に変換する
StringConverter.toNarrow()メソッドを使用します。
static String toNarrow(String str)
toNarrow2(String str)
ん
※全角ひらがなは変換しませ
実装例
String str = StringConverter.toNarrow("アイウエオ");
変数 str のコンソール出力結果:
アイウエオ
2.4 半角文字を全角文字に変換する
StringConverter.toWide()メソッドを使用します。
static String toWide(String str)
実装例
String str = StringConverter.toWide("アイウエオ");
変数 str のコンソール出力結果:
アイウエオ
All Right Reserved, Copyright
5
© FUJITSU LIMITED 2006-2015
2.7 文字列を結合する
2.10 指定された文字列を検索し, 最初に見つかった文字列を置き換える
StringHandler.combineString()メソッドを使用します。
StringHandler.replace()メソッドを使用します。
static String combineString(String[] strs)
static String replace(String s1,String s2,String s3,
int fromIndex)
実装例
実装例
String str = StringHandler.combineString(new String[] {"あ", "い", "う", "え", "お"});
String str = StringHandler.replace("あいうえおあいうえお", "う", "-", 5);
変数 str のコンソール出力結果:
変数 str のコンソール出力結果:
あいうえお
あいうえおあい-えお
2.8 文字列を ShiftJIS に変換した時の byte 数で分割する
2.11 指定された文字列を検索し, 見つかった文字列すべてを置き換える
StringHandler.divideStringByByte()メソッドを使用します。
StringHandler.replaceAll()メソッドを使用します。
static String[] divideStringByByte(String str, int len)
static String replaceAll(String s1, String s2, String s3)
実装例
実装例
String str[] = StringHandler.divideStringByByte("あいうえお", 4);
String str = StringHandler.replaceAll("あいうえおあいうえお", "う", "-");
変数 str のコンソール出力結果:
変数 str のコンソール出力結果:
str[0] = あい
str[1] = うえ
str[2] = お
あい-えおあい-えお
2.12 指定された文字列を検索し, 見つかったすべての文字列の先頭文字のインデックスを配列で返す
2.9 指定された文字列を検索し, 最初に見つかった文字列を置き換える
StringHandler.searchAll()メソッドを使用します。
StringHandler.replace()メソッドを使用します。
static int[] searchAll(String s1, String s2)
static String replace(String s1, String s2, String s3)
実装例
実装例
int ints[] = StringHandler.searchAll("あいうえおあいうえお", "う");
String str = StringHandler.replace("あいうえおあいうえお", "う", "-");
変数 ints のコンソール出力結果:
変数 str のコンソール出力結果:
ints[0] = 2
ints[1] = 7
あい-えおあいうえお
StringHandler を使用する際の注意
引数の文字列に null または空文字を渡す実装は例外をスローするメソッドが多数あります。使用する
際には必ず Javadoc を参照し、引数に渡せる値を確認してください。
All Right Reserved, Copyright
6
© FUJITSU LIMITED 2006-2015
2.13 整数を, 指定された文字数の符号無し固定長文字列に変換する
2.16 文字列を指定された長さに変換する
StringHandler.toFixedLengthInt()メソッドを使用します。
StringHandler.toFixedLengthString()メソッドを使用します。
static String toFixedLengthInt(int orgInt, int len)
static String toFixedLengthString(String orgStr, int len)
実装例
実装例
String str = StringHandler.toFixedLengthInt(7, 5);
String str = StringHandler.toFixedLengthString ("アイウエオ", 10);
変数 str のコンソール出力結果:
変数 str のコンソール出力結果:
00007
アイウエオ□□□□□
※□は半角スペース
String str = StringHandler.toFixedLengthString ("アイウエオ", 3);
2.14 整数を, 指定された文字数の符号付固定長文字列に変換する
変数 str のコンソール出力結果:
StringHandler.toFixedLengthIntSign()メソッドを使用します。
static String toFixedLengthIntSign(int orgInt, int len)
アイウ
実装例
2.17 文字列を指定された長さに変換する
String str = StringHandler.toFixedLengthIntSign(7, 5);
StringHandler.toFixedLengthString()メソッドを使用します。
変数 str のコンソール出力結果:
static String toFixedLengthString(String orgStr,
char fill)
+0007
int len,
実装例
2.15 半角文字列を, 指定された文字数の固定長文字列に変換する
String str = StringHandler.toFixedLengthString("アイウエオ", 10, '@');
StringHandler.toFixedLengthNarrow()メソッドを使用します。
変数 str のコンソール出力結果:
static String toFixedLengthNarrow(String orgStr, int len)
アイウエオ@@@@@
実装例
String str = StringHandler.toFixedLengthNarrow("アイウエオ", 10);
2.18 文字列を指定された長さに変換する(文字列左側にパディング)
StringHandler.lpad()メソッドを使用します。長さとは String::length()を意味します。target に null を渡すと長さ 0 の文字列
として扱われます。
変数 str のコンソール出力結果:
アイウエオ□□□□□
※□は半角スペース
static String lpad(String target, int len, char paddingChar)
実装例
String str = StringHandler.lpad("アイウエオ", 10, '@');
変数 str のコンソール出力結果:
@@@@@アイウエオ
String str = StringHandler.lpad(null, 10, '@');
変数 str のコンソール出力結果:
@@@@@@@@@@
All Right Reserved, Copyright
7
© FUJITSU LIMITED 2006-2015
2.19 文字列を指定された長さに変換する(文字列右側にパディング)
2.22 文字列の後方空白を削除する
StringHandler.rpad()メソッドを使用します。長さとは String::length()を意味します。target に null を渡すと長さ 0 の文字
列として扱われます。
StringHandler.trimTail()メソッド、StringHandler.rTrim()メソッドを使用します。
static String trimTail(String s1)
※'\u0020'以下と'\u3000'を空白とみなします。
rTrim(String s1)
※'\u0020'と'\u3000'のみを空白とみなします。
static String rpad(String target, int len, char paddingChar)
実装例
String str = StringHandler.rpad("アイウエオ", 10, '@');
実装例
変数 str のコンソール出力結果:
String str = StringHandler.trimTail("あいうえお
アイウエオ@@@@@
変数 str のコンソール出力結果:
あいうえお
String str = StringHandler.rpad(null, 10, '@');
変数 str のコンソール出力結果:
2.23 文字列を char で分割する
@@@@@@@@@@
StringHandler.split()メソッドを使用します。このメソッドは String::split(String)と異なり、正規表現を使用せずに分割する
分高速です。
static String[] split(String str, char c)
2.20 全角文字列を, 指定された文字数の固定長文字列に変換する
StringHandler.toFixedLengthWide()メソッドを使用します。
実装例
static String toFixedLengthWide(String orgStr, int len)
String[] strs = StringHandler.split("あいうえお", 'う');
実装例
変数 strs[0]、strs[1]のコンソール出力結果:
String str = StringHandler.toFixedLengthWide("あいうえお", 10);
strs[0]=あい
strs[1]=えお
変数 str のコンソール出力結果:
あいうえお□□□□□
");
※□は全角スペース
2.24 文字列を String で分割する
StringHandler.split()メソッドを使用します。このメソッドは String::split(String)と異なり、正規表現を使用せずに分割する
分高速です。
2.21 文字列の前方空白を削除する
StringHandler.trimHead()メソッドを使用します。
static String[] split(String str, String separator)
static String trimHead(String s1)
実装例
実装例
String str = StringHandler.trimHead("
String[] strs = StringHandler.split("あいうえお", "うえ");
あいうえお");
変数 strs[0]、strs[1]のコンソール出力結果:
変数 str のコンソール出力結果:
strs[0]=あい
strs[1]=お
あいうえお
All Right Reserved, Copyright
8
© FUJITSU LIMITED 2006-2015
2.25 文字列に指定された文字数分, 指定された文字を追加する
StringHandler.appendChar()メソッドを使用します。
static String appendChar(String orgStr, int num, char fill)
実装例
String str = StringHandler.appendChar("あいうえお", 3, 'あ');
変数 str のコンソール出力結果:
str=あいうえおあああ
2.26 文字列に指定された文字数分, 全角スペースを追加する
StringHandler.appendMultiSpace()メソッドを使用します。
static String appendMultiSpace(String orgStr, int num)
実装例
String str = StringHandler.appendMultiSpace("あいうえお", 3);
変数 str のコンソール出力結果:
str=あいうえお□□□
※□は全角スペース
2.27 文字列に指定された文字数分, 半角スペースを追加する
StringHandler.appendSpace()メソッドを使用します。
static String appendSpace(String orgStr, int num)
実装例
String str = StringHandler.appendSpace("あいうえお", 3);
変数 str のコンソール出力結果:
str=あいうえお□□□
※□は半角スペース
All Right Reserved, Copyright
9
© FUJITSU LIMITED 2006-2015
第3章 文字列チェック
3.4 文字が半角のカタカナ文字か判定する
3.1 指定の文字が Shift-JIS で 1byte であるか判定する
StringChecker.HalfKatakanaChar()メソッドを使用します。
StringChecker.is1ByteChar()メソッドを使用します。
static boolean isHalfKatakanaChar(char c)
static boolean is1ByteChar(char c)
実装例
実装例
boolean bool1 = StringChecker.is1ByteChar('ア');
boolean bool2 = StringChecker.is1ByteChar('ア');
boolean bool1 = StringChecker.isHalfKatakanaChar('ア');
boolean bool2 = StringChecker.isHalfKatakanaChar('ア');
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = false
bool2 = true
3.5 文字列がすべて半角のカタカナ文字で構成されているか判定する
3.2 文字列がすべてアルファベットで構成されているか判定する
StringChecker.isHankakuKana()メソッドを使用します。
StringChecker.isAlphabet()メソッドを使用します。
static boolean isHankakuKana(String str)
static boolean isAlphabet(String str)
実装例
実装例
boolean bool1 = StringChecker.isHankakuKana("アイウエオ");
boolean bool2 = StringChecker.isHankakuKana("アイウエオ");
boolean bool1 = StringChecker.isAlphabet("AIUEO");
boolean bool2 = StringChecker.isAlphabet("あいうえお");
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = true
bool2 = false
3.6 文字列がすべてひらがなで構成されているか判定する
3.3 文字列が null もしくは空文字かどうか判定する
StringChecker.isHiragana()メソッドを使用します。
StringChecker.isEffectiveString()メソッドを使用します。
static boolean isHiragana(String str)
static boolean isEffectiveString(String str)
実装例
実装例
boolean bool1 = StringChecker.isHiragana("あいうえお");
boolean bool2 = StringChecker.isHiragana("あいウえお");
boolean bool1 = StringChecker.isEffectiveString("");
boolean bool2 = StringChecker.isEffectiveString(null);
boolean bool3 = StringChecker.isEffectiveString("あいうえお");
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2、bool3 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = false
bool2 = false
bool3 = true
All Right Reserved, Copyright
10
© FUJITSU LIMITED 2006-2015
3.7 文字列がすべて半角文字で構成されているか判定する
3.10 文字列がすべて全角のカタカナ文字で構成されているか判定する
StringChecker.isNarrowChar()メソッドを使用します。
StringChecker.isZenkakuKana()メソッドを使用します。
static boolean isNarrowChar(String str)
static boolean isZenkakuKana(String str)
実装例
実装例
boolean bool1 = StringChecker.isNarrowChar("アイウエオ 12345");
boolean bool2 = StringChecker.isNarrowChar("アイウエオ 12345");
boolean bool1 = StringChecker.isZenkakuKana("アイウエオ");
boolean bool2 = StringChecker.isZenkakuKana("アイうエオ");
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = true
bool2 = false
3.8 文字列がすべて数字で構成されているか判定する
3.11 指定された文字列が Java 識別子として指定可能か判定する
StringChecker.isNumeric()メソッドを使用します。
StringChecker.isJavaIdentifier()メソッドを使用します。
static boolean isNumeric(String str)
static boolean isJavaIdentifier(String identifier)
実装例
実装例
boolean bool1 = StringChecker.isNumeric("12345678");
boolean bool2 = StringChecker.isNumeric("123456七8");
boolean bool1 = StringChecker.isJavaIdentifier("method1");
boolean bool2 = StringChecker.isJavaIdentifier("1method");
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = true
bool2 = false
3.9 文字列がすべて全角文字で構成されているか判定する
3.12 文字列がすべて全銀カナ文字で構成されているか判定する
StringChecker.isWideChar()メソッドを使用します。
StringChecker.isZenginKana()メソッドを使用します。
static boolean isWideChar(String str)
static boolean isZenginKana(String str)
実装例
実装例
boolean bool1 = StringChecker.isWideChar("アイウエオ");
boolean bool2 = StringChecker.isWideChar("アイウエオ");
boolean bool1 = StringChecker.isZenginKana("アイウエオ");
boolean bool2 = StringChecker.isZenginKana("アイウエオ");
変数 bool1、bool2 のコンソール出力結果:
変数 bool1、bool2 のコンソール出力結果:
bool1 = true
bool2 = false
bool1 = true
bool2 = false
All Right Reserved, Copyright
11
© FUJITSU LIMITED 2006-2015
第4章 BASE64エンコード/デコード
4.1 BASE64エンコードする
MimeUtility.encodeString()メソッドを使用します。
static String encodeString (String str, String charset)
実装例
String str = MimeUtility.encodeString("ABCDE", SJIS);
変数 str のコンソール出力結果:
str= QUJDREU=
4.2 BASE64デコードする
MimeUtility.decodeString()メソッドを使用します。
static String decodeString (String str, String charset)
実装例
String str = MimeUtility.decodeString("QUJDREU=", SJIS);
変数 str のコンソール出力結果:
str= ABCDE
All Right Reserved, Copyright
12
© FUJITSU LIMITED 2006-2015
4.3 バイナリを BASE64エンコードする
4.4 バイナリを BASE64デコードする
MimeUtility. encodeBinary ()メソッドを使用します。
MimeUtility. decodeBinary ()メソッドを使用します。
static OutputStream encodeBinary (InputStream is, OutputStream os)
static OutputStream decodeBinary (InputStream is, OutputStream os)
実装例
実装例
int BUF_SIZE = 1024 * 4;
int BUF_SIZE = 1024 * 4;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
try {
File file = new File("/test/ out.txt");
bos = new BufferedOutputStream(new FileOutputStream(file), BUF_SIZE);
bos.write("Content-Type:\n".getBytes());
bos.write("\n".getBytes());
bos.flush();
File file = new File("/test/out.gif");
bos = new BufferedOutputStream(new FileOutputStream(file), BUF_SIZE);
File inFile = new File("/test/in.gif");
bis = new BufferedInputStream(new FileInputStream(inFile), BUF_SIZE);
// bis を読み込み、BASE64 デコードし、bos に出力する
MimeUtility.decodeBinary(bis, bos);
File inFile = new File("./in.gif");
bis = new BufferedInputStream(new FileInputStream(inFile), BUF_SIZE);
// bis を読み込み、BASE64 エンコードし、bos に出力する
MimeUtility.encodeBinary(bis, bos);
} catch (・・・) {
・・・
} finally {
try {
} catch (・・・) {
・・・
} finally {
try {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (・・・) {
・・・;
}
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (・・・) {
・・・;
}
}
}
実装例の出力結果
実装例の出力結果
Content-Type:
out.txt
in.gif
Content-Type:
R0lGODlhlguw・・・
MimeUtility.enco
deBinary
GIF89・・・
R0lGODlhlguw・・・
GIF89・・・
out.txt
in.gif
MimeUtility.deco
deBinary
out.gif
All Right Reserved, Copyright
13
© FUJITSU LIMITED 2006-2015
第5章 XML の順次読込機能
5.1 概要
xFramework ユーティリティ機能が提供する XML の順次読込機能は、XML データの全量を一度に読み込むのではなく、
目的の要素単位で読み込み、業務アプリケーションはその要素単位で業務処理を実装できることができます。
これは、例えばファイル(データ)サイズが数百 MB の XML ファイルをメモリ上に一度に乗せるとメモリが逼迫され性能問
題となることを回避するために有効です。
当機能はイベントドリブン型の実装です。目的の要素の読込開始・終了に応じて登録したイベントリスナーに対して情報
を通知します。
5.2 処理フローイメージ
処理フロー
XML パーサー生成
Node リスナー生成
XML パーサー(X03)
ノードリスナー
業務処理
Node リスナー登録
XML パーサー(X03)
addXMLEventAdapter()
ノードリスナー
業務処理
XML ファイルに対する入力ストリーム
parse()呼び出し
XML パーサー(X03)
解析中に、登録されたリスナーの要素が出現した場合、
ノードリスナーの業務処理実装メソッドを呼び出す。
All Right Reserved, Copyright
14
© FUJITSU LIMITED 2006-2015
5.3 クラス詳細
5.3.1 XMLParser
5.3.3 XMLEventAdapter
要素の読込開始、読込終了の通知を受け取るイベントリスナーです。
InputStream から XML を解析するクラスです。XMLParser には addXMLEventAdapter(XMLEventAdapter adapter)メソ
ッドでイベントリスナーを登録することが出来ます。
コンストラクタの概要
メソッドの概要
XMLEventAdapter(java.lang.String name, XMLNodeType nodeType)
コンストラクタです。
void addXMLEventAdapter(XMLEventAdapter adapter)
XMLEventAdapter を登録します。XMLEventAdapter のコンストラクタに渡す name を重複して
登録することは出来ません。上書きされます。
パラメータ:
name - 要素名
nodeType - XML の要素の型を表す列挙型定数
void parse(java.io.InputStream inputStream)
XML を解析し、登録されたリスナーのメソッド呼び出しを行います。
XMLEventAdapter(java.lang.String name, XMLNodeType nodeType, boolean receiveEvent)
コンストラクタです。
パラメータ:
name - 要素名
nodeType - XML の要素の型を表す列挙型定数
receiveEvent - イベントを受け付けるか否か(true=イベントを受け付ける)
5.3.2 XMLNodeType
XMLNodeType は要素の型を指定するための列挙型定数です。後述する XMLEventAdapter のコンストラクタに指定し
ます。
列挙型定数の概要
メソッドの概要
DECIMAL
要素が実数(BigDecimal)であることを示す列挙型定数です。
boolean startElement(org.xml.sax.Attributes attributes)
要素の読込が開始されたことを受け取るメソッドです。
LIST
要素が List<Map<String, Object>>であることを示す列挙型定数です。
パラメータ:
attributes - 属性
戻り値:
LONG
要素が整数(Long)であることを示す列挙型定数です。
処理を続行するならば true
MAP
要素が Map<String, Object>であることを示す列挙型定数です。
boolean endElement(java.lang.Object xmlData)
要素の読込が開始されたことを受け取るメソッドです。通常、業務アプリケーション開
発者はこのメソッドをオーバーライドして業務処理を実装します。入力パラメータ xmlData は、
XMLNodeType の型に応じて変換されます。
STRING
要素が文字列であることを示す列挙型定数です。
パラメータ:
xmlData - 読み込んだ XML データを保持する Object
戻り値:
メソッドの概要
処理を続行するならば true
java.lang.Class<?> getType()
要素の値の型を返します。
java.lang.String getName()
通知対象となる要素名を取得します。コンストラクタで渡した name が返ります。
XMLNodeType getNodeType()
XML の要素の型を表す列挙型定数を取得します。コンストラクタで渡した nodeType
が返ります。
boolean isReceiveEvent()
イベントを受け付けるか否かを返します。
All Right Reserved, Copyright
15
© FUJITSU LIMITED 2006-2015
5.4 XML→Object 変換イメージ
以下に XML から Object への変換イメージを示します。
以下の例では、Map の中に List が存在する構造となっています(=customer 要素の中に address 要素が存在する)。
この場合、要素"customer"を"MAP"として指定し、要素"address"を"LIST"として指定することで、階層構造を持つ Object をリスナ
ー(XMLEventAdapter)が受け取ることが出来ます。(後述する XMLEventAdapter に渡す XMLNodeType が"LIST"の場合は、
List<Map<String, Object>>として変換することができます)
実装に際して注意すべき点としては、以下の点が挙げられます。
1.要素"customer"を"MAP"として指定しただけでは要素"address"をリスナーが受け取ることは出来ないため、必ず
XMLParser#addXMLEventAdapter()によってリスナーを追加する必要があります。
2.要素"address"を"LIST"として指定しなかった場合、XMLParser は”customer”要素の中に存在する要素"address"を破棄してよ
いか判断が出来ないため、必ず XMLParser#addXMLEventAdapter()によって要素"address"が LIST であることを登録する必要が
あります。
3.ルート要素直下の第一要素には"LIST"の型は指定することが出来ません。
4."LIST"の型は endElement()によってイベントを受け取ることが出来ません(LIST の終了を検出することが困難なため)。
詳しくは次ページの実装例を参照してください。
<?x ml v ers i on="1.0" encodi ng ="U TF -8"?>
○
繰り返し
数
1
<da ta >
○
1
-
<ty pe>
○
1
半角数字
<cus tomer>
○
0~n
○
1
半角英数字
○
1
半角英数字
○
1
半角英数字
○
1
半角英数字記号
▲
0~n
-
▲
1
半角数字
▲
1
全角半角文字
▲
1
全角半角文字
▲
1
半角英数字
▲
1
半角英数字
要素名
<cus tomeri d>
<l a s tna me>
<f i rs tna me>
<ema i l >
<a ddres s >
<zi pcode>
<pref >
<ci ty >
<number>
<bui l di ng >
必須
属性
-
-
→ String
Map<String, Object>
customerid
要素値
lastname
要素値
firstname
要素値
email
要素値
address
List<Map<String, Object>>
→ List<Map<String, Object>>
Map<String,
zipcode
pref
city
number
building
→ String
→ String
→ String
→ String
→ List<Map<String, Object>>
→ String
→ String
Object>
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
要素値
要素値
要素値
要素値
要素値
Map<String, Object>
customerid
要素値
lastname
要素値
firstname
要素値
email
要素値
address
List<Map<String, Object>>
Map<String,
zipcode
pref
city
number
building
→ String
→ String
→ String
Object>
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
Map<String, Object>
customerid
要素値
lastname
要素値
firstname
要素値
email
要素値
address
List<Map<String, Object>>
Map<String,
zipcode
pref
city
number
building
Object>
要素値
要素値
要素値
要素値
要素値
zipcode
pref
city
number
building
All Right Reserved, Copyright
16
© FUJITSU LIMITED 2006-2015
5.5 実装例
実装例を以下に示します。実装例では以下の形式の XML ファイルを読み込み、CSV ファイルに書き込むものとします。
形式
出力項目
項番
1 XMLヘッダ宣言
2 業務データ情報
3
顧客種別
4
5
6
7
8
9
10
11
12
13
14
顧客情報
タグ名
<?x m l v ers i on="1.0" encodi ng ="U TF -8"?>
<da ta >
<ty pe>
顧客ID
名前(姓)
名前(名)
メールアドレス
住所情報
郵便番号
都道府県
市区町村
番地
建物名
<cus tom er>
<cus tom eri d>
<l a s tna m e>
<f i rs tna m e>
<em a i l >
<a ddres s >
<zi pcode>
<pref >
<ci ty >
<num ber>
<bui l di ng >
必須
○
○
○
○
○
○
○
○
▲
▲
▲
▲
▲
▲
繰り返し
桁数
属性
数
( B y te数)
1
1
1
3
半角数字
0~n
1
1
1
1
0~n
1
1
1
1
1
10
20
20
255
7
200
200
200
200
半角英数字
半角英数字
半角英数字
半角英数字記号
半角数字
全角半角文字
全角半角文字
全角半角記号
全角半角記号
設定内容
形式
顧客種別を表す3桁の数字を設
定する
-
-
記号「-」は設定しない
-
備考
1行目に出力される情報
-
サンプルデータ
<?xml version="1.0" encoding="UTF-8"?>
<data>
<type>100</type>
<customer>
<customerid>CID0000001</customerid>
<lastname>yamada</lastname>
<firstname>taro</firstname>
<email>[email protected]</email>
<address>
<zipcode>2118588</zipcode>
<pref>神奈川県</pref>
<city>川崎市中原区上下田中</city>
<number>4-1-1</number>
<building></building>
</address>
</customer>
<customer>
<customerid>CID0000002</customerid>
<lastname>suzuki</lastname>
<firstname>ziro</firstname>
<email>[email protected]</email>
<address>
<zipcode>1057123</zipcode>
<pref>東京都港区</pref>
<city>東新橋</city>
<number>1-5-2</number>
<building>汐留シティセンター</building>
</address>
</customer>
</data>
All Right Reserved, Copyright
17
© FUJITSU LIMITED 2006-2015
実装例
public void 実装例() {
XMLParser parser = new XMLParser();
try (final BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(new File("C:/tmp/convert.csv")), Charset.forName("Shift_JIS")));
final InputStream inputStream = new BufferedInputStream(new FileInputStream(new File("C:/tmp/sample.xml")))) {
// type要素の読込が完了したときの業務処理実装
parser.addXMLEventAdapter(new XMLEventAdapter("type", X03CXMLNodeType.STRING) {
@Override
public boolean endElement(Object xmlData) {
if (xmlData instanceof String) {
String value = (String)xmlData;
try {
writer.write(value);
writer.newLine();
} catch (IOException e) {
getLogger().log(BasicLevel.ERROR, "CSVファイルへの書込みに失敗しました。", e);
// エラーが発生しているので業務処理を継続しても意味がないのでイベントの受け取りを中止するためにfalseを返す
return false;
}
}
// 正常に処理が完了しているので処理を継続するためにtrueを返す
return true;
}
});
// customer要素の読込が完了したときの業務処理実装
parser.addXMLEventAdapter(new XMLEventAdapter("customer", XMLNodeType.MAP) {
@Override
public boolean endElement(Object xmlData) {
if (xmlData instanceof Map) {
try {
@SuppressWarnings("unchecked")
Map<String, Object> value = (Map<String, Object>)xmlData;
// IDを書き込む
Object customerid = value.get("customerid");
if (customerid instanceof String) {
writer.write((String)customerid);
writer.newLine();
}
// 名前(姓)を書き込む
Object lastname = value.get("lastname");
if (lastname instanceof String) {
writer.write((String) lastname);
writer.newLine();
}
// 名前(名)を書き込む
Object firstname = value.get("firstname");
if (firstname instanceof String) {
writer.write((String) firstname);
writer.newLine();
}
次のページへ続く
All Right Reserved, Copyright
18
© FUJITSU LIMITED 2006-2015
// メールアドレスを書き込む
Object email = value.get("email");
if (email instanceof String) {
writer.write((String)email);
writer.newLine();
}
// address要素配下の情報を,区切りで書き込む
Object address = value.get("address");
if (address instanceof List) {
@SuppressWarnings("unchecked")
List<Map<String, Object>> list = (List<Map<String, Object>>)address;
for (Iterator<Map<String, Object>> it = list.iterator(); it.hasNext();) {
Map<String, Object> next = it.next();
// 郵便番号を書き込む
Object zipcode = next.get("zipcode");
if (zipcode instanceof String) {
writer.write((String)zipcode);
}
writer.write(",");
// 都道府県を書き込む
Object pref = next.get("pref");
if (pref instanceof String) {
writer.write((String)pref);
}
writer.write(",");
// 市区町村を書き込む
Object city = next.get("city");
if (city instanceof String) {
writer.write((String)city);
}
writer.write(",");
// 番地を書き込む
Object number = next.get("number");
if (number instanceof String) {
writer.write((String)number);
}
writer.write(",");
// 建物名を書き込む
Object building = next.get("building");
if (building instanceof String) {
writer.write((String)building);
}
writer.newLine();
if (it.hasNext()) {
writer.newLine();
}
次のページへ続く
All Right Reserved, Copyright
19
© FUJITSU LIMITED 2006-2015
}
}
} catch (IOException e) {
getLogger().log(BasicLevel.ERROR, "CSVファイルへの書込みに失敗しました。", e);
return false;
}
}
return true;
}
});
// 要素"address"のイベントは受け取らないが、型情報は登録する必要がある
parser.addXMLEventAdapter(new XMLEventAdapter("address", XMLNodeType.LIST, false));
// XML解析処理実行
parser.parse(inputStream);
// CSVへの書込みをフラッシュする
writer.flush();
} catch (IOException e) {
getLogger().log(BasicLevel.ERROR, "予期せぬ例外が発生しました。", e);
}
}
出力結果
100
CID0000001
yamada
taro
[email protected]
2118588,神奈川県,川崎市中原区上下田中,4-1-1,
CID0000002
suzuki
ziro
[email protected]
1057123,東京都港区,東新橋,1-5-2,汐留シティセンター
All Right Reserved, Copyright
20
© FUJITSU LIMITED 2006-2015
Fly UP