メソッド - みる会図書館


検索対象: 月刊 C MAGAZINE 2001年2月号
40件見つかりました。

1. 月刊 C MAGAZINE 2001年2月号

なります。そこで ReleaseObject/ReIeaseOb 演奏するときになってダウンロードが実行 ・ SetSearchDir jectByUnknown や CoIIectGarbage を適切な されることになるので , 発声までのレイテ 部分で呼び出し , 不要になったオプジェク ンシが大きくなってしまいます。とくに Wa SetSearchDir は , SetSearchDirectory メ ソッドでローダーの検索用ディレクトリを トについてのキャッシングを解除していき ve データなどをセグメントとして再生する セットします (List 6 ) 。カレントディレクト ます ( List7- ( 1 ) ) 。 際にはレイテンシを小さくしておくことが リは先ほどの CreateLoaderPerformance で もう 1 つのダウンロードは , 以前の Direct 重要なので , DATA のロード時に合わせて セットできますが , 別のディレクトリを検 Music でもバンドの音色を割り当てる際な 実行しておくのがよいと思います。 dmlight 索用ディレクトリとしてセットする必要が どに行われていた処理です。ただし , Direc . d Ⅱでは , あるときには SetSearchDir を利用します。 Ⅸ 8 ではセグメントのメソッドとして実行 ・ DATA のロード時 (CreateSegFromFile) ローダーで DirectMusic の DATA オプジェ できるようになっています。パフォーマン ・演奏 / 再生時 (PlayPrimarySegment, P クトをファイルから生成するには , スに対してオートダウンロードという設定 laySecondarySegment) ・ GetObject メソッドに F ⅱ e 名のみ渡す も可能ですが , その場合にはセグメントを ・任意のタイミング ・ GetObject メソッドに File 名を含む F 訓 CreateLoaderPerformance 関数 / ヾスを渡す の 2 つの方法がありますが ミューシック extern ” C ” int —stdcall CreateLoaderperformance(HWND ぬ d , BOOL fsetdr) プレイヤなどのプログラムでユーザが動的 HRESULT hr; char pat m [ 期 x ー PATHI; / / パスを格納する、 MAX—PATH については windef. h を参照 に任意のファイルをロードしたい場合を除 WCHAR wpathnm[MAX—PATH]; けば , DATA ファイルをロードする場所は if(false==gf—coinå) {return 11 / / coln 辻土 a は ze 呼び出し済みかどうかの確認 固定されることがほとんどです。そこで , / / IDi て ec us 土 cLoad “の獲得 / / if ( NULL==g—pILoader ) { hr=COCreateInstance(CLSID—DirectMusicLoader, Nt ル CLSCTX—INPRW, GetObject メソッドに File 名のみを渡して DA IID—IDirectMugicLoader8, (void**)&g—pILoader) 引 if(FAITIRD(hr)){ TA オプジェクトを生成する場合は事前に Se g—pILoader=NULL ・ return 1 tSearchDirectory を使用してローダーの検 索用ディレクトリをセットしておくと便利 です。 ・ CreateSegFromFiIe CreateSegFromFiIe は , GetObject メソッ ドでファイルからセグメントオプジェクト を生成します ( List7 ) 。 DirectX 8 では新しく LoadObjectFromFile というメソッドも追加されているので , DA TA ファイルの構成によってはそちらを利用 したほうがよいかもしれません。 こでは ほかにも DirectX 8 で追加されたメソッドに よる 2 つの重要な処理 , ・ローダーによるオブジェクトのキャッ シング [ 注 5 ] の管理 ・パフォーマンスへの音色のダウンロー ド なども行います。 オプジェクトの重複ロードを避けるため にローダーに取り入れられているキャッシ ングですが , 再度呼び出されないオプジェ クトに対してはただのメモリのムダ遣いと 60 C MAGMINE 2001 2 List / / BOO も fset 社が駅ならカレントのディレクトリを / / / / Loade ての検索用ディレクトリとしてセット 土 f ( 駅 = = fset ) { ZeroMemory(pathnm, 肱4X-. PATH); GetCurrentDirectory ( MAX—PATH , pathnm MuItiByteToWideChar(CP—ACP, 0 , pathnm, ー 1 , wpathnm, MAX—PATH); hr=g—pILoader->SetSearchDirectory(GUID—DirectMusicAIITypes, wpathnm, FALSE); if(FAILD(hr)){return 31 //IDirectMusicPerformance の獲得 // if(NULL==g-pIPerformance) { hr=CoCreateInstance(CLSID—DirectMusicPerformance, 肌痴も , CLSCTX. -INPRW, IID—IDirectMusicPerformance8, (void**)&g—pIPerformance) ・ if(FAILED(hr)){ g—pIPerfomance=NULL ー return 1 〃プライマリセグメント用デフォルトオーディオパス / / hr=g—pIPerformance->InitAudio(NULL, NULL, hwnd, DMUS—APATH—SHARED—STEREOPLUSREVERB 128 , DMUS—AUDIOF—ALL, NULL); 土 f ( FA 団 ( 社 ) ) { g—pIPerformance—>Release( g—pIPerformance=NULL ・ return 5 〃セカンダリセグメント用 3D オーディオパス / / hr=g—pIPerformance → CreateStandardAudiOPath(DMUS—APATH. -DYNAMIC—3D, 128 , TRUE, &g_p13DAudioPath); if(FAILED(hr))( g—p13DAudioPath=NULL; g—pIPerformance->CIoseDown( g—pIPerformance->ReIease( g—pIPerformance=NULL ・ return 57 ー return 0 ー

2. 月刊 C MAGAZINE 2001年2月号

Java programmingTips て現在の日時を取得しています。まず , Ca javac CurrentTime2. java DateFormat クラスを でコンパイルし , lendar クラスの s ねⅱ c メソッドである getlnsta 用いた書式指定 nce() メソッドを使って CaIendar オプジェク java CurrentTime2 で実行します。実行結果は List 1 と同じく , トを得ます。そして Calendar クラスの getTi List 1 , 2 では日時の表示に DateFormat ク 現在の時刻が表示されます。 me ( ) メソッドを用いて , 現在の日時を表す ラスを使いました。今度はこの DateFormat List2 は List1 とほとんど同じですが , List Date オプジェクトを得ています。 DateFor クラスに注目します。 DateFormat クラスは 2- ①の部分だけが少々異なります。 こは mat クラスを用いた表示部分は List 1 とまっ いくつかの表示用メソッドを持ち , 引数で List 1- ②に対応し , CaIendar クラスを使っ たく同じです。 書式を指定することによってさまざまな形 式で日時を表示 ( あるいは文字列に変換 ) す Fig. 1 日時をさまざまな形式で表示するアプリケーション ( 1 ) の実行結果 ることができます。 次にあげるのはさまざまな形式で日時を getlnstance( ) : 00 / 11 / 29 20 : 48 getDateInstance( ) : 2 圓 0 / 11 / 29 表示するプログラムです田 st3 ) 。 getTime I nstance ( ) : 20 : 48 : 34 getDateTimeInstance() : 2000 / 11 / 29 20 : 48 : 34 javac FormatTime1. java : 00 / 11 / 29 SHORT : 2000 / 11 / 29 MEDIUM でコンパイルし , : 2000 / 11 / 29 LONG FULL : 2000 年 11 月 29 日 java FormatTime1 : 20 : 48 SHORT で実行します ( Fig. 1 ) 。 MEDIUM : 20 : 48 : 34 : 20 : 48 : 34 : JST LONG Fig. 1 の最初の 4 行は , DateFormat オプジ FULL : 20 時 48 分 34 秒 JST ェクトを取得するいくつかの sta ⅱ c メソッド の使い分けを示しています。おのおののメ ソッドを用いて取得した DateFormat オプジ ェクトに関して , format() メソッドを呼び 出しています ( List 3- ① ) 。 getlnstance() メ ソッドは List 1 , 2 でも使っていますが , 日 時を短い形式で表示します。 getDateInsta nce() メソッドは日付のみ , getTimeInstan ce() メソッドは時刻のみ , getDateTmeInsta nce() メソッドは日付と時刻の両方を表示 します。メソッドの名前のままですね。 Fig. 1 の中央の 4 行は , getDateInstance ( ) メソッドに引数を与えて書式を指定する方 法を示したものです ( List3- ② ) 。 DateFor mat クラスに定義されている SHORT , ME DIUM, LONG, FULL という定数を getDa telnstance() 引数に与えると , それぞれ実行 結果に示した表示になります。 Fig. 1 の最 後の 4 行も同様で , こちらは getTimeInsta nce ( ) メソッドに引数を与えて書式を指定 したものです ( List3- ③ ) 。 SimpleDateFormat クラス を用いた書式指定 次に , 書式文字列によって表示形式が指 定できる SimpleDateFormat クラスの使い方 Java Programming Tips 1 25 List 日時をさまざまな形式で表示するアプリケーション ( 1 ) / / 日時の表示フォーマット ( 1 ) import java. uti に * ー import java. text. * ー public class FormatTime1 ( public static void main(string args[ ] ) { 〃現在の日時を取得 Date d = new Date( 〃日時の表示 ( 1 ) system. out. print ln( "getlnstance( ) 十 DateFormat. getlnstance( ). format(d) system. 0uし . print ln( "getl)atelnstance( ) 十 DateFormat. getDateInstance( ) . format(d) system. ou し print ー n ( ngetTime lnstance ( ) 十 DateFormat. getTimeInstance( ) . format(d) system. ou し print ー n ( DgetDateTime lnstance ( ) 十 DateFormat. getDateTimeInstance( ) . format(d) リ System. out. println( / / 日時の表示 ( 2 ) System. out. println( DSHORT 十 DateFormat. getDateI nstance ( DateFormat. SHORT ) . format(d) system. 0uセ . println( "MEDIUM : 十 DateFormat. getDate lnstance ( DateFormat. MEDIUM ) . format(d) system. 0uしPて土n凵n( ”も ONG 十 DateFormat. getDate lnstance ( DateFormat. LONG ) . format(d) system. out. println( "FULL 十 DateFormat. getDateInstance(DateFormat. FULL 。 ) . format(d) System. out. println( / / 日時の表示 ( 3 ) system. out. println( "SHORT 十 DateFormat. getTimelnstance(DateFormat.SHORT ) . format(d) system. 0uセ . println( "MEDIUM : 十 DateFormat. getTimeInstance(DateFormat. MEDIUM) . format(d) system. 0uセ . println( "LONG 十 DateFormat. getTime lnstance ( DateFormat. LONG ) . format(d) System. out.println( "FULL 十 DateFormat. getTimeInstance ( DateFormat. FULL ) . format(d) ①

3. 月刊 C MAGAZINE 2001年2月号

わち今日の主流的なコンビュータ技術の用 語 / 概念としてのドキュメントは , 本体テ キストと特定のマークアップが最初から溶 着 ~ 一体化したテキスト実体です。全体を 「テキスト実体」と呼ぶのは , ご存じのよう にマークアップも本体テキストと同様に文 字データだからです。テキスト本体と特定 のマークアップとの固着関係ー一両者が自 由に分離していないことーーに私はある 種の " 古代的技術 " の匂いを感じるのです。 前回は , XML ドキュメントをオプジェク トとして表現するときの規格である DOM (Document Object Model) の検討を開始し ましたから , 今回はその続きを片づけまし よう。前回は DOM のサプ規格である Java l-anguage Binding(DOM のオプジェクトを Java 言語で書くとこうなるという Java コー ド集 ) を引用しながら DOM の Document, すなわち XML ドキュメントのオプジェクト としての基本構造を見ていきました。今回 は直接的に Java のコードからではなく , ま ずふつうの文章で DOM の規格を説明しな がらドキュメントの構造を検討していこう と思います 0 Microso 代は正しく , 私はドジだった ! まず , DOM のドキュメント ( 中でもとり わけ XML ドキュメント ) は , Node オプジェ クトの階層 , すなわち Node オプジェクト を文字通りノードとするツリー構造です。 前回引用した Java Language Binding におけ る Node インタフェイスの定義を見るとそ れは , ノードのタイプを表す名前付き定数 (TEXT NODE , COMMENT NODE など ) 以外は , まさにツリーのノードそのもので した。たとえば自分の子や親や兄弟にアク セスするメソッド , 新たな子を挿人するメ ソッド , 既存の子を取り去るメソッドなど が揃っていました。すわなち DOM の Node オプジェクトは , Java のインタフェイスと しては List 1 のような構造でした。 Node オ プジェクトは , 主なメソッド名から察して も , ご覧のようにほとんど普遍的なツリー のノードそのものですが ( たとえば getPare ntNode ( ) メソッドや getFirstChild ( ) メソッ ドなどがある ) , 実際の DOM の規格では , Node を実装した各オプジェクト間にそれほ ど完全なツリーのノードとしての直交性は ありません。たとえばドキュメント (Docu ment) もノード (implements Node) ですから , ドキュメントの子として別のドキュメント があってもよさそうですが , DOM の規格 ではそれは認められていません。 DOM の 規格の中には , Document を子として持つ オプジェクトはなく , したがって次に説明 するように , それはほとんど " 最上位の " オ プジェクトです DOM のドキュメント , すなわち DOM が オプジェクトの形式として定義している X ML ドキュメントは , Document オプジェ クトです。上で述べたように DOM では ドキュメントを構成するあらゆるオプジェ クトが Node ですから , Document も Node で す。ただし DOM という規格の特殊な性質 の一つとして , この Document には親があ りません。言い換えると DOM 規格の中に は , Document を子として持つドキュメン ト成分はありません / ありえません。つま り Document は「国家」などと似て , それ自 身で単独最上位の成分です ( 誰ですか ? 「国家」の上には「国連」がある , なんて言う 人は ! ) 。そしてドキュメント (Document オプジェクト ) が持ちうる子は , 以下の 4 種 0 DOM (Java Language Binding)N0de インタフェイス List 1 〃ノードのタイプを表す名前付き定数 1 : pub は 0 interface NOde{ 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 16 : 17 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 38 : 39 : 40 : 41 : 150 42 : ) 類です : Document pub lic static final public static final pub lic static final pub lic static final pub lic static final pub ー ic static fina ー pub lic static final pub lic static final pub lic static final pub lic static final pub lic static final pub lic static final pub lic String public String public VOid public short public NOde pub lic NodeList public NOde public Node public NOde public N0de short short short short short short short short short short short short ELEMENT_NODE ATTRIBUTE_NODE TEXT—NODE CDATA—SECTION_NODE ENTITY—REFERENCE—NODE ENTITY—NODE PR(ESSING_INSTRUCTION—NODE COMMENT—NODE TYPE_NODE WTATION—NODE Element( 最大で一つ ) Processinglnstruction Comment DocumentType getNodeName( getNOdeValue( ) throws mMException ー setN0deval ue ( string nodeva lue ) throws (X)MException ー getN0deT} ・ 8(嶹 / / 上のノードタイプのどれか getparentN0de ( getChil dNodes ( getFirstChil d ( getLastChild( ); getprevioussib ー ing ( ); getNextSib ling ( public NamedNodeMap getAttributes( / / このノードが Element なら属性があるかも public Document public NOde public Node public Node public NOde public boolean public N0de getownerlhcument(); / / このノードが属すドキュメント insertBefore ( Node newChil d , Node refChild) throws mMException ー replaceChild(Node newChild, cloneNode(boolean deep); hasChildN0des(); / / このノードに子があるか ? throws X)MException ー appendChild(Node newChild) throws (X)MException ー removeChild(Node oldChild) throws (X)MException ー Node oldChild) Document が持っ子の内 , " ( 最大で一 つ ) " と注記されている Element は , このド キュメント自身を表すルート要素です。 el ement は " 要素 " という訳語が定着している ようですが , これまで縷々検討してきたよ うに , われわれ的見地から言えばそれはド キュメントの要素そのものというよりもむ しろ「要素指定」ですね。たとえばフォント の指定 , 写真の U 糺の指定 , このタグの下 の本体の性質 ( 例 : 請求科目 ) の指定 , など など。要素そのもの = 情報の実体は - ー - 画 像ファイルなどのように 別ファイルに あったり , あるいはタグく TAG > ~ く / TAG > C MAGAZINE 2001 2

4. 月刊 C MAGAZINE 2001年2月号

Java 帳禁でお困り programmingTips 一、、。うあ 0 / なんですてるの最氏 と実行します。たとえば , 月 1 日」と解釈され , 例外は発生しません。 用途に応じて使い分けられます。 java DaylnWeek 2000 2 1 と入力すると , 曜日の次は , 年と月の日数を求めていま 2000 年 2 月 1 日は火曜日 す (List 5- ⑤ ) 。これには Calendar クラスの 年間の日数は 366 , 月間の日数は 29 getActualMaximum() メソッドを使用しま 今日までの日数は 302 す。例では引数に "DAY_OF_YEAR", "DA という実行結果を表示します ( 当然実行す Y ー OF ー MONTH " を指定していますが , ほか る日付によって「今日までの日数」は変わり にもいろいろあるので , ぜひ Java API リフ ます ) 。曜日と一緒に , その時点での年 ァレンスをご一読ください。 間・月間の日数 , そして今日までの日数も 最後に , 指定した日から今日までの日数 表示します。そういえば今年はうるう年で を求めています ( List 5- ⑥ ) 。 Calendar クラ したね。 スの getTime() メソッドで Date オプジェク さっそくプログラムの解説ですが , List トを得たあとに , さらに Date クラスの get 5- ①は後回しです。次の List 5- ②では , コマ Tme() メソッドを用いて , 日時を 1970 年か ンドラインで指定した年 , 月 , 日を CaIen ら数えたミリ秒 (long) に変換しています。 dar オプジェクトに set() メソッドを用いて long 値同士で引き算したあとに , 単純な割 設定しています。 CaIendar オプジェクトで り算で日数に変換しています。本当はうる は月を 0 から 11 までの値として扱うのでご注 う秒なども考慮すべきなので , あまり厳密 意を。続いて曜日を表示します ( List ト③ ) 。 ではない計算なのですが , 通常はさほど問 何も難しいことはなく , 先ほど使った SimpIe 題ないでしよう。 DateFormat クラスで曜日の書式文字である ト終わりに 「 E 」を使うだけです。 さて , 先ほどの List5- ①ですが , これは List 5- ④に関係します。 Calendar クラスの 今回は日付と時刻を取得・表示する Tips setLenient() メソッドは , 設定した日付を解 をお届けしました。 釈する際の厳密性を決めるものです ( lenie Date クラスと Calendar クラスを使った現 nt: 寛大な ) 。今回のように "setLenient 在の日時の取得 , DateFormat クラスや Si ( false ) " とすると解釈が厳密になり , 「 13 月」 mpleDateFormat クラスを使った日時のさま や「 32 日」のように実際には存在しない日付 ざまな書式での表示 , そして Calendar クラ を指定したときに IllegalArgumentException スの各種メソッドを使った曜日や日数の計 が発生します ( この例では getTme ( ) メソッ 算を紹介しました。 ドで CaIendar の値を取り出そうとした際に 日付や時間はさまざまなソフトウェアで 例外が発生します ) 。 を "setLenient 使う機会があると思います。ぜひ役立てて (true) " とすると , たとえば「 1 月 32 日」は「 2 ください。 Fig. 3 SimpleDateFormat クラスの書式文字列 G 暦法 h 時 ( 12 時間制 ) H 時 ( 24 時間制 ) E 曜日 a 午前 / 午後 文字列のエスケープ用 シングルクオート 0 0 あリシ るボー 」 ! オ インタ - ネット対応帳票作成ツ - ル。 , ・動作環境 Microsoft@ Windows9 95 / 98 、 Microsofte Windows NT ・ Ver4 十 SP3 以上 Microsofte Windowse 2000 ・構成フォームエデイタ、描画コントロール、 ビュアー、ビューコントロール ( オプション ) 、 Ver4. X 互換 DLL ( オプション ) ・描画機能直線・四角形・円・扇・弓・弧・多角形、 ラベル・データフィールド・リストフィールド・ テキストフィールド・バーコードフィールド、ビクチャ、 イメージフィールド、 OLE オプジェクト ・バーコードの種類 CODE39 、 CODE128 、 JAN8 、 JAN13 、ほ F 、 NW7. 郵便バーコード、 PDF417 ( オプション ) 、 QR コード ( オプション ) ・対応イメージ JPEG 、 BMP 、 D 旧、 WMF 、 EMF 、引 FF ( フォーマットに制限あり ) ※シーオーリホーツは、株式会社工イチ・オー・エスの登録商標です。 ※ Mic 「 0S0 化 Windows, Windows NT は、米国マイクロソフト社の 米国またはその他の国における商標または登録商標です。 く体験版・お問い合わせは〉 株式会社ェイチ・オー・エス URL http://www.hos.co.jp/ TEL 052-683-7102 FAX 052-683-7104 E-Mail:info@hos.co.jp く資料請求番号 12 / 〉 Java programming Tips 1 2 /

5. 月刊 C MAGAZINE 2001年2月号

コラム 1 クラス名の衝突 iPEX を使用する場合に Reader, lnput Stream , OutputStream といったクラス名が 出現します。 これらは com.infoteria.ipex.dom や com. infoteria. ipex. stream といったノヾッケージよ り提供されますが , これらのクラス名は java. io パッケージにも含まれています。そ のためソースプログラム中で java. io. * を import すると , 単に Reader や InputStream といったクラス名を利用している部分がコ ンパイルエラーとなります。これは , 使用 している Reader クラスが com.infoteria.ipe x. dom. Reader なのか , java. i0. Reader なのか があいまいになるためです。 これを回避するには , com.infoteria.ipex. dom. Reader あるいは java. i0. Reader といっ たようにクラス名をフルバッケージで指定 する方法と , impo 文でデフォルトとなる クラスを指定する方法があります。 List A は単に Reader クラスを指定した場合に , c om. infoteria. ipex. dom. Reader であることを コンパイラに通知するものです。 impo 「 t 文でデフォルトとなるクラスを指定する List import java. iO. * ー import com. infoteria. ipex. dom. * ー //Reader クラスは com. infoteria. ipex. dom. Reader を使用 com. infoteria. ipex. dom. Reader; TabIe 4 DOME 「「 0 「 Han 引 e 「のエラーコールバックメソッド メソッド名 fata 旧「「 0 「 e 「 ro 「 warrmng 呼び出しタイミン WeII-formed でなくなるようなエラーが発生した場合に呼び出される 警告レベ丿レのエラーが発生した場合に呼び出される 工ラーが発生した場合に呼び出される Fig. 2 バーシンク中にエラーが発生した場合のシーケンス図 :Sample :MyHandIer ようにすれば Sample クラス自身が fatalErr or, error, warning メソッドを持っことに なります。 Fig. 2 ではパーシング中に各工ラーが検 出されると , MyHandler クラスの対応する 158 C MAGMINE 2001 2 M Handle 「 0 インスタンス生成 XMLReader( … ) インスタンス生成 「 ead() パーシング処理 :XMLReade 「 ー発生時に呼ばれる メソッド (fatalError , error , warning のい すれか ) が呼ばれます。工ラー処理が完了 すると , 再び XMLReader の read メソッド 内に復帰することになりますが , このあと パーシング処理を継続するかどうかは , ユ ーザプログラムから指定することはできま せん。 XML ドキュメントに 1 つでもエラーがあ る場合 , もうそれ以降はエラーチェックを 行わず次の処理に移りたい場合もあれば , ひととおりすべてのエラーを検出したい場 合もあります。本来なら fataIError, error, warning の各メソッドには , パーシング処 理を続行するかどうかの戻り値などがあれ ばよりべターではないでしようか。現状で は , 致命的で続行不可能なエラーが発生し ないかぎりパーシングは続行されるようで す。 いては , メソッドの throws 節でそれらを宣 せん。 RuntimeException のサプクラスにつ on クラスより派生されていなければなりま ローされる例外クラスは , RuntimeExcepti MyHandIer クラスの error メソッドよりス List 2 にその方法を示します。このとき として , 例外をスローする方法があります。 るでしよう ) 。これを回避するための方法 に大きなドキュメントでは深刻な問題とな たい場合には困ったことになります ( とく んが , 工ラー検出後にパーシングを終了し したい場合はとくに何の問題も発生しませ 工ラー発生後でもパーシング処理を続行 パーシング処理では , XML ドキュメン XML ドキュメントの作成 で届くことになります。 事 read メソッド発行元の catch プロックま MLReader クラス内では catch されずに無 error メソッドよりスローされた例外は , X この方法によって , MyHandler クラスの す。 ないため , コンパイルエラーとなるからで の各メソッドにはそのような宣言は存在し ークラスである DOMErrorHandler クラス いった宣言を行う必要があります。スーパ ッドの throws 節で「 throwsParseException 」と サプクラスをスローするためには , 各メソ or , warning の各メソッドから Exception の 言する必要がないからです。 fataIError, err

6. 月刊 C MAGAZINE 2001年2月号

List 2 DOM (Java Language Binding)Element インタフェイス 1 : public interface Element extends NOde( 2 : 3 : 4 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 16 : public String public String public VOid public VOid public 耻 t て public Attr public Attr getTagName( getAttribute ( string name setAttribute ( string name , string va lue ) throws mMException; removeAttribute ( string name ) throws mMException ー / / 属性の値を得る getAttributeNode(String name); //Node としての属性を得る ↑ Attr オブジェクト setAttributeN0de ( Attr newAttr ) / / throws mMException ー removeAttributeN0de( Attr 引 dAttr ) throws mnxception ー List 3 JDOM version 1 ℃ (beta 5) の Element. getText() メソッド StringBuffer textcontent = new StringBuffer ( / / コンテンツ成分が複数の要素から成り立っている場合 return (string)content.get(0); / / 単純にそれを返す & & ( content. get( 0 ) instanceof string ) ) { if ((content.size( ) / / コンテンツ成分がたったーっでしかもそれが s 加 g の場合 return / / 空文字列を返す Ⅱ (content.get(O) -=null)){ if ( (content = null ) Ⅱ (content.size( ) く 1 ) / / この引 ement 以降のコンテンツ成分が空の場合 1 : public string getText( ) ( 15 : 14 : 13 : 12 : 11 : 10 : 5 : 4 : 2 : public NodeList getElementsByTagName(String name); public VOid normalize( List 4 全テキストを取り出す再帰呼び出し textcontent. append( (Element)0bj. getText( ) / / 再帰呼び出し 1 : if (obj instanceof Element){// 子が EIement なら 2 : 3 : 4 : 5 : if (textcontent.length( ) 〉 0 ) { hasText = true; 16 : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : 26 : 35 : 34 : 33 : 32 : 31 : 30 : 29 : 28 : 引 ean hasText = fal se; lterator = content. iterator ( リ while (i . hasNext()){ 〃全要素を一つずつ見ていく Object obj = i.next( if (obj instanceof string){ // 要素が string ならテキストである textcontent. ap*tld( (string)obj); hasText = true ー )else if (obj instanceof CDATA){ / / CDATA の中身もテキストと見なす textcontent. append( ( (CDATA)obj) . getText( ) hasText = true return textcontent. toString ( )else{ return if ( !hasText){ 属性などがあるでしよう : く FONT size= ” 56 ” face= ” MS 明朝” ふざけんじゃねーよ く / FO N T> color= ” red ” > トを「正規化」します。正規化とは , 余計な ために この Element 以降の全ドキュメン 者 normalize() は , その後の処理の便宜の 子 EIement(s) のリストが得られます。後 name として " * ' を指定すると , すべての る EIement のリストを取得します。引数の でしよう。前者は , この Element の子であ る getElementsByTagName ( ) と normalize ( ) ら見当がつきにくいのは , 最後のほうにあ ンタフェイスのメソッドの内 , 名前だけか 倒的に多いことが分かります。 EIement イ う名前の付いた , 属性関係のメソッドが圧 あります。そのほか , xxxAttribute() とい を設定するメソッド setAttribute() などが 出すメソッド getAttribute() , 一組の属性 を指定してその属性の値 ( 例 : " 56 " ) を取り getTagName() , 属性の名前 ( 例 : "size") この EIement のタグ名を取り出すメソッド 用しておきます (List 2 ) 。ご覧のように ing から Element インタフェイスの定義を引 見ておくために再び Java Language Bind このような , EIement そのものの構造を スペース文字や改行を取り去って , マーク アップ要素とそれらの間にあるテキスト要 素だけから成る一一一別の言い方をすると : テキスト要素とそれらを挟んでいるマーク アップ要素だけから成る一一単一の文字列 ( と言っていいかな ? ) を作り上げることで す。前回見た XMLTreeDisp プログラムで は , Java の String クラスの trim() メソッド を使って , この正規化らしきことを行って います。 この EIement の直下の子がテキストコン テンツ (Text 成分 ) だった場合 , そのテキス トをどうやって取り出すか ? 現状の DOM の Java lmguage Binding のまっ正直な実装 だけがある場合には , EIement の ( というか Node の ) getFirstChild ( ) を呼び出し , その 返し値である Node ( 仮に cNode と呼びまし よう ) の getNodeType() を呼び出し , 結果 が TEXT NODE ならば cNode の getNodeVa lue ( ) を呼び出してテキスト文字列を得る , という手順でしよう。直下だけではなく , 全テキストを取り出すためには , すべての 子 EIement ( s ) についてこの過程を繰り返せ ばよいでしよう。 使いやすい DOM API として評判の良い J DOM は , その Element クラスの中に getTe xt() というメソッドを定義しています。参 考のために ( 上の説明をより具体的に理解 するために ) , それを見ておこうと思いま す (List 3 ) 。 JDOM の Element クラスの getText() メソ ッドの , 3 行目などで参照している content フィールドは , この Element のすべての子 を XML 文書中に書かれている順に , java. util. LinkedList オプジェクトの中に収納した ものです。 19 ~ 28 行目までの while ループ 中の文でお分かりのように このメソッド はこの EIement の " 直属の " テキストだけを 取り出しています。この EIement の子の EI ement ( s ) に属するテキストを取り出すた めには , 別途 Element. getChiIdText(name— of—the—child—node) などのメソッドが提供 されています。 直属だけではなく , この Element の下に ある全テキストを取り出すためには , この メソッドの while ループの中に List 4 のよう な再帰呼び出し文を加えればよいでしよう。 再帰呼び出しを加えた Element. getText() をドキュメントのルート要素に対して呼び 出せば , それは機能的にたぶん , Swing の Document の getText() メソッドに相当する はずです ( 後出の Table 1 参照 ) 。 以上見てきたように XML のドキュメン ト , ないし今日のマークアップ言語概今に c 言語フォーラム 153

7. 月刊 C MAGAZINE 2001年2月号

= 3 最新の dm ⅱ ght. def ・・・・・・モジュール定義ファイ 能ですが , ⅲ t64 [ 注 4 ] をサポートしていない ・ L 旧 RARY 文・・・・・・ DLL の名前を指定 場合は dmusici. h でエラーとなるので注意し ・ DESCR 旧 T ℃ N 文・・・・・・ DLL の目的につ の 3 つです。これに加えて , デバッグ時の てください。なお , ファイナルのソース , いて記述する 情報として関数のエラーコード「 e or. ⅸ t 」 コンパイル / リンク済み DLL は , それぞれ \ d ・ EXPORTS 文・・・・・・エキスポートする関 mlight ディレクトリ内の }source , in に収 ( Fig. 4 ) も用意しておきました。 数の名前を順に記述 「 VisuaI C + + 6.0 」と「 BorIand C + + BuiIder 5 」 録しています。 提供されるファイル [ 注 4 ] 「 int64 」は 64 ビット整数のデータ型です。 でのプロジェクト生成方法をコラム 1 にま 初期のころの Windows C ℃ + + 開発環境ではこの とめておいたので , 必要に応じて参照して DLL を構成するソースファイルは , データ型に対応していないものもあります。 Dire ctMusic のコードをコンパイルする際にインクル ください。 ・・コード dmlight. cpp ・ ードする dmusici. h には、 そのほかの C / C + + 開発環境でもビルド可 ・・ヘッダファイル dmlight. h typedef ——int64 REFERENCE_TIME; のような定義があり , i 猷 64 をサポートしてい ない開発環境はここでエラーとなります。 Fig. 4 関数のエラーコード ( e 「「 0 「 . txt ) ーエラーコード表ー dmlight. dll の関数 1 -10 : 関数の引数に問題がある場合 1 : 1 番目の引数の値が不適切 , もしくは何らかの問題がある dmlight. dll で利用可能な関数は Table 1 に 2 : 2 番目の引数の値が不適切 , もしくは何らかの問題がある 3 : 3 番目の引数の値が不適切 , もしくは何らかの問題がある 示すとおりです。以下 , それぞれの関数に 4 : 4 番目の引数の値が不適切 , もしくは何らかの問題がある ついて順に解説します。 1 1 -30 : COM 関連のエラー 1 1 : Co ⅶ tia ⅱ ze の呼び出しが失敗した , もしくはまだ呼び出されていない。 12:CoCreatelnstance の呼び出し失敗 , インタフェイス : lDi 「 ectMusicLoade 「 8 への ポインタが獲得できない。 13:CoC 「 eatelnstance の呼び出し失敗 , インタフェイス : IDi 「 ectMusicPerformance8 へのポインタが獲得できない 31-50 : ローダ関連のエラー 31 :lDirectMusicLoade 「 8 のメソッド , SetSearchDi 「 ectory が失敗 , 指定されたバスが セットできない。 32 : ローダーオブジェクトのインタフェイス : lDirectMusicLoade 「 8 へのポインタは まだ獲得されていない。 33:lDi 「 ectMusicLoader8 のメソッド , GetObject が失敗 , インタフェイス . IDi 「 ectMusicSegment8 へのポインタが獲得できない。 51 -70 : パフォーマンス関連のエラー 51 :lDi 「 ectMusicPerfo 「 mance8 のメソッド , ⅶ tAudi0 が失敗した。 52 : パフォーマンスオブジェクトのインタフェイス :lDi 「 ectMusicPerformance8 への ポインターはまだ獲得されていない。 53:IDirectMusicPerfo 「 mance8 のメソッド , PlaySegment が失敗した。 54」Di 「 ectMusicPerformance8 のメソッド , 曰 aying が失敗した。 55」Di 「 ectMusicPerfo 「 mance8 のメソッド , SetG10balParam が失敗した。 56:lDirectMusicPerfo 「 mance8 のメソッド , GetGIobaIParam が失敗した。 57:lDirectMusicPerformance8 のメソッド , C 「 eateStanda 「 dAudioPath が失敗した。 58:lDi 「 ectMusicPerformance8 のメソッド , PIaySegmentExt)\ 失敗した。 71- : その他のエラー 71 : 引数で指定されたセグメントオブジェクトのインタフェイス : IDi 「 ectMusicSegment8 へのポインターはまだ獲得されていない。 72 : Win32 API MuItiByteToWideChar が失敗した。 73」Di 「 ectMusicSegment8 のメソッド , DownIoad が失敗した。 DllMain 関数 DWORD fdwReason, LPVOID lpvReserved) BØも WINAPI DllMain(HINSTANCE hinstDLL switch(fdwReason) ( cage DLL—PRWESS—DETACH: CIeanUp( break; ・ DllMain DLL のエントリポイントを設定する際に オプションで初期化 / 終了処理用の通知コ ードを指定することができます。ここで指 定可能なタイミングは TabIe 2 に示す 4 種類 ですが , dm ⅱ ght. d Ⅱでは DL し冬了時の処理 で確実にクリーンアップをするために , List 3 に示すように DLL_PROCESS_DLTACH を 指定しています。 ・ OpenDmIight OpenDmlight は Dmlight ライプラリの初 期化処理を行います。 List4-(1) に示すよう に , まず CoInitiaIize を呼び出して COM ライ プラリを初期化し , 次いでバージョン情報 の通知 ( 必要なら ) を行っています (List 4- ② ) 。 COM に準拠したコンポーネントを使 用する場合は事前に必ず CoIni ⅱ alize を呼び 出してライプラリを初期化しておかなくて はならないので , dm ⅱ ght. d Ⅱの関数を使用 するときにはほかのすべてに優先して , ま ずこの関数を呼び出しておく必要がありま す。 CoInitialize の呼び出しをエントリポイン ト DIIMain で行うという考え方もあります が , 今回の実装では DLL 初期化用の関数と 特集 3 最新の DirectMusic を使う 5 / List て e セてれ TRUE;

8. 月刊 C MAGAZINE 2001年2月号

期の日本語を研究するための言語学の資料 として見ていくときには , 当然それにふさ わしいマークアップの列 ~ マークアップの 体系を付けることになるでしよう。 こまで色々見てきた中では , とにかく , この getRootElements ( ) のみ , ずば抜けて 異彩をはなっており , ドキュメント概念お よびドキュメント技術における「未来的」な ものの匂いすら感じさせます。この未来性 を生かしたドキュメントの実装を志すとき には , Document の自作の実装クラスの中 に , setRootElements ( ) や addRootElement() などのメソッドを定義するとよさそうで す。 JDK の中にある Document の実装クラス である AbstractDocument などを見ますと , 現状の getRootElements ( ) の実装はソース 中で手書き的に Element を設定しており , 活用の程度がまだまだ浅すぎます。 Swing と XML/DOM の Document を比較 したついでに , Document の文字通り要素 (element(s) ) である Element オプジェクト を , やはり両システムに関して比較一覧し ておきましよう (Table 2 ) 。ご覧のように EIement は基本的に「ツリーのノードを実 装したオプジェクト」ですから , Swing の それも XML/DOM のそれも大きな違いは ありません。 Swing の Document および Ele ment はあくまでも GUI から操作されるオプ ジェクトなので , 要素や属性を操作するメ ソッドが GUI 側の関連クラスに分散してい ることが , 違いといえば違いです。また XML や HTML のドキュメントは , マークア ップ等も含めてそれ全体がひとつのテキス ト ~ テキストファイルでもあるのですが DOM という規格の性質からして , ドキュ メントに対するこのような即物的な見方 (swing の Element.getStartOffset() メソッド などに見られる見方 ) は DOM には存在しま せん。しかしそれはただ , オプジェクト規 格の抽象性レベルに起因する違いです。 連載 3 回にわたり , 現在の主流的なドキ ュメント技術の概要を知るために , JavaS wing の Document オプジェクト , および X ML/DOM の Document オプジェクトを調 べてきました。その全体的な印象としては , 今や「泣いても笑ってもマークアップ全盛 期である」ということがいえます。 ドキュメントの ( = 情報の ) 中軸を成すテ キスト本体の随所にマークアップを挿入す ることによって , コンピュータが実行すべ き処理の方針や , テキストの各部分の性格 , ドキュメント全体の構成 ~ 構造などを指定 します。 マークアップ以前のドキュメント技術は , 広義のパーサプログラムーーたとえば " ト ークンアナライザ " ーーーが ( 既存の言語学の 概念をそのまま援用したような ) 難解で不 安定なアルゴリズムを駆使してテキスト中 ~ 情報中の各要素を抽出したり , あるいは ワープロ製品などは独自規格の制御記号を 使って , ドキュメントの各部分の処理方式 などを ( 画面表示機構やプリンタなどに対 して ) 指示していました。そういう意味で は , 私企業製ソフトすらも『標準的なマー クアップ言語』を使用する今日のドキュメ ント技術は , 一段進化した技術状況だとい えます。この点は , 率直に認めなければな りません。 しかし今日のマークアップというものを もっと広義に / より一般的にとらえて , 「ド キュメントに対する ( 情報コンテンツに対 する ) メタ情報」というもの , およびその標 準規格を考えるならば , さらに成熟した , 便利度の高い , 高度な多様なドキュメント アプリケーションを開発しやすい , 標準ド キュメント技術体系をわれわれは構想しう るでしよう。次回はまとめとして , 現時点 で考えられうる『究極のドキュメント技術』 の姿をスケッチしてみましよう。そこから , " 索引づくり " という本稿の出発点となって いる課題に対しても , より柔軟性のあるア プローチが導き出される , と私は予感して います。 TabIe 2 EIement の比較 機能要素 この曰 ement が所属している ドキュメントを取得する 親 EIement を得る この曰 ement の名前を得る 子の日 ement を得る 子の曰 ement の数を得る 属性を得る Java Swing の EIement getDocument() getPa 「 entEIement() getName() getAtt 「 ibutes() 下記※ 3 を参照 下記※ 4 を参照 下記※ 5 を参照 getEIement() getEIementIndex() getElementCount() ドキュメント中のこの曰 ement の 所在位置 ( 開始位置 ) を知る ドキュメント中のこの曰 ement の getStartOffset() 終了位置を知る この曰 ement には子がない ? 正規化 getEndOffset() isLeaf() ( なし ) ( なし ) NOde. hasChiIdNodes() no 「 malize() XML/DOM の Element N0de. getOwne 「 Document() Node. getPa 「 entNode() ※ 1 getTagName() getAtt 「 ibute() ※ 2 getAtt 「 ibuteNode() setAttribute() setAtt 「 ibuteNode() 「 emoveAttribute() 「 emoveAttributeNode() getEIementsByTagName() ( なし ) ( なし ) ※ 1 : DOM では曰 ement の親 Node が曰 ement ではないこともありえる ※ 2 ※ 5 DOM の getAttribute() は属性名を引数として値を取得 , getAtt 「 ibuteNode() は Node オプジェクトとしての Att 「 オプジェクト ( 属性オプジェクト ) を取得する ※ 3 ・ getAtt 「 ibutes() の返し値の AttributeSet に色々な属性取得メソッドが定義されている ※ 4 ・文字の属性などは GUI 側 (JTextPane) で set する 属性の add() , remove() は , Document の実装クラスが持つ AttributeContext が管理し操作する C 言語フォ ーラム 155

9. 月刊 C MAGAZINE 2001年2月号

可 OY PerI Programmmg モジュレを活用はう アルゴリズム RSA Data Secu 「 itylnc. MD2 メッセージダイジェストアルゴリズム RSA Data Secu 「 itylnc. MD5 メッセージダイジェストアルゴリズム NIST SHA -1 メッセージダイジェストアルゴリズム http://www.itl.nist.gov/fipspubs/fip180-1. htm Table 1 Digest モジュー丿レで使えるアルゴリズム いるのです。 以上の 2 つの性質により , メッセージダ イジェストは , あるファイルの内容が改ざ んされていないかどうか , また別のファイ ルに置き換えられていないかどうかの判定 に使うことができます。 今回のサンプルプログラムでは , このメ ッセージダイジェストを PerI から使用して , ファイルの書き換えが行われていないかど うかを調べるプログラムを作りましよう。 Digest モジュール サンプルプログラムと解説 List 1 (digest—test. (l) は , メッセージダ イジェストの働きを試す簡単なプログラム です。これを実行すると , be5f570dbeed5dfC5240375585818745 という文字列が表示されます。これは , "This is good. という文字列をメッセージとしたときのメ ッセージダイジェスト (MD5) の値を 16 進 数で表示したものです。 be, 5f, 57 , 0d, be, ed, 5d, fc, 52 , 40 , 37 , 55 , 85 , 81 , 87 , 45 という 16 バイトになっています。 以下 , List1 の内容を解説します。 まず , use Digest; では Digest モジュールを使用することを宣 言しています。このときに使われるファイ ルは , perl のライプラリディレクトリにあ る Digest. pm というファイルです。筆者の Fig. 1 Digest. pm が見つからないときのエラー メソッド Digest->MD2 Digest->MD5 Digest->SHA1 TabIe 2 Digest モジュールのメソッドー覧 $dobj->b64digest $dobj->hexdigest $dobj->digest $dobj->addfile($filehandle) $dobj->add ($message. … ) $dobj->new $dobj-> 「 eset $dobj = Digest : :MD5->new($arg, … ) $dobj = Digest->new(MD5=>$arg, … ) $dobj = Digest->MD5($arg. … ) メソッド 意味 メッセージダイジェストを行うオブジェクトを生成する。 MD5 の部分にはアルゴリズム名が書かれる オブジェクトの内部状態をリセットする $message, …をダイジェスト値を計算するメッセージと して追加する $ f ⅱ ehan 引 e はファイルハンドル。ファイルはファイルの 終端まで読み込まれ , その内容がメッセージとして追加 される ダイジェスト値を得る。 digest はバイナリデータとして , hexdigest は 1 6 進文字列として , b64digest は Base 64 文 字列として得る。オブジェクトの内部状態はリセットさ れる 環境では , C:YPerlYsiteYlibYDigest. pm とい うファイルになります。もしもこのファイ ルがない場合には , Fig. 1 のようなエラー が表示されます。この場合には CPAN(htt p://www.cpan.org/) から Digest というモジ ュールを入手することになります。 〇 Digest->MD5 $d0bj = Digest->MD5; では , 実際にメッセージダイジェストを計 算するオプジェクトを変数 $ dobj に得ます。 こではアルゴリズムとして MD5 を選択 しています。そのほかのアルゴリズムにつ いては Table1 を参照してください。 can't locate Digest.pm in @INC (@INC contains: C:/perl/lib c:/perl/site/ lib digest—test. p ー line 1. BEGIN failed--compi ねし ion aborted at digest—test.pl line 1. . ) at 〇 add $d0bj->add("This is good. " ) ; では , メッセージダイジェストを計算する データを $ d 。 bj に追加します。 add メソッド は繰り返し呼ぶことができます。追加した データはダイジェスト値を計算するのに用 いられます。 ファイル全体のメッセージダイジェスト を計算する場合には , addfile メソッドを呼 び出します。 〇 hexdigest print $dobj->hexdigest, ”¥ n ” では , これまでに $ dobj に追加したデータを メッセージとしてダイジェスト値を計算し , それを 16 進数として表示しています。 hex digest メソッドは , 一度呼び出すとオプジ ェクトの内部状態がリセットされるので , 何度もダイジェスト値を利用するなら , 別 Enjoy PerI Programming モジュールを活用しよう 83

10. 月刊 C MAGAZINE 2001年2月号

ロ朝 開発環境 iPEX for Java iPEX for Java は Java べースの XML 処理工ンジン です。各種ソフトウェアに組み込むことで , Java + XML というボータビリティの高い , 幅広いプラット ホームに対応したシステムを構築できます。 小薗三典 物ん知お”新″ g g 派当も ドを利用します。 XML ドキュメントを生 J XP との互換 iPEX for Java の概要 成するためには , XMLWriter クラスの write メソッドを利用します (List 1 ) 。 2000 年 11 月 1 日にインフォテリア ( 株 ) よ 2000 年 3 月にサン・マイクロシステムズ バシング処理 より JAXP (Java API for XML Processing) か り , Java による XML 処理工ンジンである 発表されました。これは , Java をベースと iPEX forJava が発売されました した XM レヾーサが実装すべき I の共通仕 パーシング処理とは XML ドキュメント iPEX (lnfoteria Processing Engine for XM を解析することです。解析された XML デー L) は , XML 対応のアプリケーションソフト 様として位置付けられています。 タは , DOM(Document Object Model) や S iPEX は , これまで C + + による幅広いプラ ウェア開発に必要な XML 処理を網羅した AX(Simple API forXML) などに代表される ソフトウェアです。各種アプリケーション ットホーム上での提供を行ってきました。 XML 操作用 API を使ってアプリケーション そのため iPEXforJava では , JAXP との互換 ソフトウェアに組み込んで使用すること から処理を行えます。今回の iPEXforJava よりもむしろ従来の C + + 製品との互換を重 で , XML データの解析 , 検証 , 編集 , 変換 Ver. 1.0 では DOM が利用可能です。 などを簡単に行うことができます。 視した設計となっています。 パーシング処理を行うためには , 前述の XML を Java で処理することは , 移植性や ハッケージ構成 ポータビリティの面である意味を持ちま ように XMLReader クラスの read メソッド を呼び出します ( List 1 の 33 ~ 36 行目 ) 。 す。ご存じのように Java はプラットホーム iPEX より提供されるパッケージを TabIe のクラスにはコンストラクタが何種類か存 に依存しないプログラミング言語として , 在しますが , DTD (Document Type Defini 1 に示します。 また XML も環境に依存しないデータ交換 tion) を利用した妥当性検証 ( バリデーショ フォーマットとして , ともに次世代を担う iPEX を利用して XML ドキュメント処理 ン ) チェックを行ったり , 妥当性工ラーを を行う場合に中心的役割を果たすものが , IT 革命の中心的技術です。現存するコンピ ュータシステムには , さまざまなハードウ com.infoteria.ipex.domパッケージより提供 検出するためには , Fig. 1 に示すコンスト ラクタでインスタンスを生成しなければな ェア , OS , 開発言語などが存在します。 される XMLReader クラスと XMLWriter ク このような状況のなかで , コンピュータ環 ラスです。 りません。 第 1 引数の is では , パーシングを行う XM 境に左右されないシステムを構築するため XML ドキュメントの解析処理を行うた L ドキュメントを指定します。この InputSt には , Java + XML の組み合わせが不可欠と めには , XMLReader クラスの read メソッ いえるでしよう。 TabIe 1 iPEX より提供されるパッケージ Java + XML の組み合わせは , ハイエンド バッケージ サーバ環境から携帯端末まで幅広いプラッ com.infoteria.ipex.dom iPEX の中心をなすクラス群 トホームの対応を可能とし , また B2B ( 企 com.infoteria.ipex.st「eam XML ドキュメントの入出力ストリーム 業間取引 ) においても急激に変化をもたら com.infoteria.ipex.util 現在は 2 つのオプジェクトをベアとする Pai 「クラスのみ W3C の推奨する DOM のプログラミングインタフェイス 0 「 g. w3c. dom しています。 156 C MAGAZINE 2 1 2 概要