JAXPのすべて 第2回

Sun の XML 処理用ツールキットによる XML の変換

この2回シリーズの第1回では、Java™ API for XML Processing (JAXP) とその解析機能および検証機能について紹介しました。JAXPでは、JavaプログラマーがExtensible Stylesheet Language (XSL) を使用してXMLドキュメントを変換することができます。JAXPでは、ダイレクト・プログラム・アクセスとXSLテンプレートの両方を使用することで、XML形式を別の形式に簡単に変換できるようにしています。ここでは、JAXPを使用してXMLドキュメントを変換する方法と、XSLスタイルシートをキャッシュしてパフォーマンスを最大限に高める方法について説明します。

Brett D. McLaughlin, Sr., Author and Editor, O'Reilly Media, Inc.

Photo of Brett McLaughlinBrett McLaughlin氏は、Logo (小さな三角形を覚えていますか?) の時代からコンピューターの仕事をしています。現在の専門は、JavaおよびJava関連のテクノロジーを使ったアプリケーション・インフラストラクチャーの構築です。ここ数年は、Nextel Communications and Allegiance Telecom, Inc. でこれらのインフラストラクチャーの実装に携わっています。Brett氏は、Javaサーブレットを使ってWebアプリケーション開発のための再利用可能なコンポーネント・アーキテクチャーを構築するJava ApacheプロジェクトTurbineの共同設立者の1人です。同氏はまた、オープン・ソースのEJBアプリケーション・サーバーであるEJBossプロジェクトと、オープン・ソースのXML Web公開エンジンであるCocoonにも貢献しています。



2005年 5月 31日

JAXPが登場した当初、JAXPという名前はJava API for XMLParsing を表していました。第1回で説明したとおり、JAXPはSAXおよびDOMの上位層で、Javaプログラマーがベンダーに依存しないXML解析を実行できるようにするものです。もともとJAXPにはこの機能しかありませんでしたが、それは過去の話で今は違います。

以前は、Java と XML の組み合わせと言えば、それ自体がほぼ解析のようなものでした。Javaアプリケーションは、XMLドキュメントを読み取った後、そのドキュメントのデータをプログラム的に操作するだけでした。しかしながら、XMLを使用するアプリケーションが普及してくるにつれて、各種アプリケーションが必要とする処理に多数の共通点があることが明らかになりました。さまざまな優良ソフトウェアのおかげで、これらの共通点から仕様が生まれました (また、便利なAPIが新たに誕生することもありました)。

XMLの普及から生まれた最初の仕様の1つがXSLです (参考文献を参照)。アプリケーションは絶えずXMLデータを取得し、何らかのフォーマットを加えて、それを (通常はHTML、XHTML、WMLのいずれかとして) ユーザー・インターフェースに渡します。XSLでは、このタスクを基に仕様が策定され、それによりアプリケーションは独自仕様の変換コードを使わずに済むようになりました。XSL仕様の施行とともに、Transformation API for XML (TrAX) も登場しました (参考文献を参照)。TrAXにより、JavaアプリケーションのXSLに対して単純かつ一貫したアプローチが提供されました。こうした経緯を経て最終的に (また、さらなる進化の始まりとして) 現在のJAXPが開発され、TrAXがコアのJava開発環境に組み込まれました。このような発展と、拡張検証やXPathサポートなど最近の追加機能を踏まえると、現在のJAXPはその名の通り、Java API for XMLProcessing を表していると言えます。ここでは、解析ではなくデータ処理にJAXPを使用する方法を中心に説明します。

ポイントAからポイントBへ

XSLの基本的なプログラム・フローを理解することは、JAXPにおける変換の処理方法を把握するうえで重要です。XSLに慣れていない方は、XSLの基本を簡単に復習してみましょう。また、XSLに習熟している方も、この説明をご覧になることをお勧めします。

ソース (XML)

XSLを扱うときには、XMLから始めます。当たり前のように思えるかもしれませんが、これは重要なことです。おそらく読者の方々は、phonebook.xmlなどのXMLファイルを使用して、それをXSLプロセッサーに渡すことは慣れているでしょう。JAXPでは、単にファイルを渡すだけでなく、さまざまな処理を実行できます。次のセクションでは、JAXPを使用した入出力について説明します。

スタイルシート (XSL)

多くの設計者が関心を持っているのは、おそらくXSLスタイルシートでしょう。スタイルシートは一連の命令で構成され、それらの命令によって、入力データのタイプや、出力データのセットおよびフォーマットのセットが指定されます。ただし、スタイルシートはドキュメント内の特定のデータに対してではなく、入力されたXML構造に対して処理を行う点に注意してください。これによりスタイルシートは、ある特定のインスタンス・ドキュメントではなく、所定の形式の任意のXMLと連携するようになります。

ターゲット (*ML)

最後に、XSLから出力が可能なのは、厳密にフォーマットされたマークアップ言語のみであることに注意してください。Microsoft WordドキュメントやPDFを出力することはできません。XML、XHTML、WMLなどのマークアップ言語か、その他の優良*ML (マークアップ言語) 変種に限定されます。

もちろん、これには異論もあるでしょう。「あなただって、XMLからPDFを出力するアプリケーションや、XMLドキュメントをExcelに変換するアプリケーションを見たことがあるはずだ」という異論もあるでしょう。確かに、XML固有の特色を活かしてバイナリ形式に変換できるエンジンが存在することは事実です。しかしながら、これはXSLの範疇ではなく、変換後のプロセスです。JAXPはXMLの変換には役立ちますが、JAXPがバイナリ形式に変換するわけではないのです。


入出力

読者の皆さんはおそらく、XML変換の多くが単なる入出力に関するものであるという意見を聞いたことがあるでしょう。XMLを取り込み、何らかの処理を行って、*MLを出力するだけ、という意見です。ここでは核心に触れる前に (多くの方が関心を持たれているとは思いますが)、まずはデータをJAXPに取り込む方法とJAXPから取り出す方法について説明します。

JAXPの柔軟性

JAXPは一般的な変換エンジンではありません。JAXPでは、Javaのプロパティー・ファイルや1回限りのテキスト形式をXMLやその他のマークアップ言語形式に変換することはできません。実際JAXPはHTMLでさえ、厳密にフォーマットされていなければ受け入れません (一部のXHTMLの派生種についても同じです)。したがって、JAXPで汎用APIを実際以上に活用するには、厳密にフォーマットされたXMLから始める必要があります。そうしなければ、すべてに問題が生じてしまいます。

JAXPの柔軟性は、XMLをどのように表現できるかによります。JAXPがXMLをファイルとして、またはファイルでラップアラウンドされたストリームとして受け取ることは明白ですが、DOMDocument (ディスク上のどこにも存在しない可能性のあるXMLドキュメントを表す) や、一連のSAXイベント (XMLドキュメントも表す) を入力として受け取ることも可能です。このような柔軟性が加わったことにより、任意の一連のXMLイベントにJAXPを挿入できるようになりました。たとえば、SAX使用してXMLドキュメントを読み取った後、そのデータの一部を別のアプリケーションに渡すコードがある場合は、単にJAXPをSAXコードと相手方のアプリケーション・コンポーネントの間に挿入することができます。JAXPはSAXイベントを使用し、必要に応じてデータを変換した後、その結果を受信側のアプリケーション・コンポーネントに渡します。

ここで重要なことは、ほぼ任意の標準形式でXMLをJAXP に入力し、出力もさまざまな形式で行えるということです。この種の柔軟性が現時点では必要ないとしても (あるいは、このような各種形式を使用する方法がわからないとしても)、必要になったときにはいつでもJAXPを利用することができます。

入力のソース

javax.xml.transform.Source インターフェースは、JAXPへのあらゆる入力と、変換APIのベースとなります。このインターフェースが定義するメソッドは、getSystemId()setSystemId(String systemId) の2つのみです。実際には、JAXPが提供する具体的な実装に比べれば、このインターフェースを直接扱うことはそれほどないでしょう。

インターフェース・プログラミング 101

インターフェースを扱い慣れていない場合は、リスト1において、常に等号 (=) の左側にインターフェースが示され、右側に具体的な実装クラスが示されることに注意してください。したがって、Sourceは左側、StreamSourceSAXSource などは右側に示されます。

  • javax.xml.transform.dom.DOMSource は、DOMNode (およびその子) をJAXPに渡します。
  • javax.xml.transform.sax.SAXSource は、(XMLReaderからの) SAXコールバックをJAXPに渡します。
  • javax.xml.transform.stream.StreamSource は、FileInputStream、またはReaderでラップされたXMLをJAXPに渡します。

リスト1に、変換に使用するSourceの作成方法をいくつか示します。

リスト1.Sourceインターフェースの実装の使用
// Create a Source from a file on disk
Source fileSource = 
  new StreamSource(new File("phonebook.xml"));
 
// Create a Source from a DOM tree
Document myDomDocument = getDocument();
Source domSource = new DOMSource(myDomDocument);

// Create a Source from an InputStream
BufferedInputStream bis = 
  new BufferedInputStream(getInputStream());
Source streamSource = new StreamSource(bis);

// Create a Source from a reader and SAX InputSource
XMLReader myXMLReader = getXMLReader();
InputSource myInputSource = getInputSource();
Source saxSource = new SAXSource(myXMLReader, myInputSource);

リスト1は非常に簡単です。Sourceを作成したら、XMLをJAXPのXSL処理部分に送ることができます。

出力結果

変換そのものに移る前に、Sourceに対応する出力javax.xml.transform.Resultを見てみましょう。出力にも、Sourceと同じ2つの基本メソッド、getSystemId()setSystemId(String systemId) があります。

入力の場合と同様、一般にはJAXPの具体的なResult実装を使用します。

  • javax.xml.transform.dom.DOMResult は、変換された内容をDOMNodeに渡します。
  • javax.xml.transform.sax.SAXResult は、変換結果をSAXContentHandlerに渡します。
  • javax.xml.transform.stream.StreamResult は、変換された*MLをFileOutputStream、またはWriterに渡します。

リスト2に、単純な例をいくつか示します。これらはリスト1Sourceの内容と良く似ています。

リスト2.Resultインターフェースの実装の使用
// Write to a file on disk
Result fileResult = 
  new StreamResult(new File("output.xml"));
 
// Write a Result to a DOM tree (inserted into the supplied Document)
Document myDomDocument = getDocument();
Result domResult = new DOMResult(myDomDocument);

// Create a Result from an OutputStream
BufferedOutputStream bos = 
  new BufferedOutputStream(getOutputStream());
Result streamResult = new StreamResult(bos);

// Create a Result to write to a SAX ContentHandler
ContentHandler myContentHandler = new MyContentHandler();
Result saxResult = new SAXResult(myContentHandler);

SourceインターフェースとResultインターフェース、およびJAXPでバンドルされる実装について理解できたら、すでにXML変換の半分は習得できたことになります。


JAXP による変換の実行

第1回を読んでからしばらく経っている場合や、JAXPや解析がまだ少し苦手という場合には、少し時間をかけてSAXParserFactoryクラスとDOMBuilderFactoryクラスについて復習しましょう。これらのクラスの使用方法がわかれば、JAXP変換のしくみがよくわかるはずです。

ファクトリーの取得

変換自体は非常に単純なものです。最初に、入力シンクと出力シンクの設定が必要です。入力XMLドキュメントとXSLスタイルシートの両方にSourceをラップし、変換結果の書き込み先シンクを作成し、それをResultでラップします。

次に、静的なnewInstance()メソッドを使用して、TransformerFactoryを作成する必要があります。リスト3に、詳細をすべて示します。

リスト3.TransformerFactoryインターフェースの新規作成
try {
  // Set up input documents
  Source inputXML = new StreamSource(
    new File("phonebook.xml"));

  Source inputXSL = new StreamSource(
    new File("phonebook.xsl"));

  // Set up output sink
  Result outputXHTML = new StreamResult(
    new File("output.html"));

  // Setup a factory for transforms
  TransformerFactory factory = TransformerFactory.newInstance();

} catch (TransformerConfigurationException e) {
  System.out.println("The underlying XSL processor " +
    "does not support the requested features.");
} catch (TransformerException e) {
  System.out.println("Error occurred obtaining " +
    "XSL processor.");
}

このステップについて説明することはあまりありません。例外処理にかかる時間は、このコード自体の処理にかかる時間とほぼ同じです。SAXおよびDOM ファクトリー・クラスと同様に、一方の例外で必要な (ただしサポートされていない) 機能を処理し、もう一方の例外で具体化エラーを処理します。

ID変換

あるバージョンのTransformerFactory.newTransformer() は、引数を一切受け入れません (したがって、XSLスタイルシートも受け入れません)。このため、入力XMLをある形式 (ストリームなど) から別の形式 (DOMツリーなど) へ単純に変換するID変換を実行することができます。ユーザーはXMLを一方の形式のSourceとして指定し、それをもう一方の形式のResultとして渡します。これは覚えておくと便利です。

ファクトリー・クラス自体は、Transformer (次のサブセクションを参照) のインスタンスを取得する際や、単純な構成を実行する際に使われます。setFeature(String feature, boolean value) メソッドを使用すると、プロセッサー上の機能を呼び出すことができます。もちろん、ファクトリーで設定された機能はすべて、そこから作成されたすべてのTransformerインスタンスに適用されます。

Transformerの作成

次に、オブジェクトを取得して実際の変換を実行します。これも、単にファクトリーでnewTransformer() を呼び出した後、使用するXSLスタイルシートをメソッドに指定するだけの単純なコード行です。リスト4に、実行される内容を示します。

リスト4.TransformerFactoryを使用したTransformerの作成
try {
  // Set up input documents
  Source inputXML = new StreamSource(
    new File("phonebook.xml"));

  Source inputXSL = new StreamSource(
    new File("phonebook.xsl"));

  // Set up output sink
  Result outputXHTML = new StreamResult(
    new File("output.html"));

  // Setup a factory for transforms
  TransformerFactory factory = TransformerFactory.newInstance();

  // Get a transformer for this XSL
  Transformer transformer = factory.newTransformer(inputXSL);

} catch (TransformerConfigurationException e) {
  System.out.println("The underlying XSL processor " +
    "does not support the requested features.");
} catch (TransformerException e) {
  System.out.println("Error occurred obtaining " +
    "XSL processor.");
}

ここで特筆すべきことはそれほどありません。覚えておくべきことは、Transformerと特定のスタイルシート間の連携のみです。スタイルシートはTransformerの作成時に使用されるため、これがインスタンスとともに使用できる唯一のXSLとなります。別のスタイルシートを使用して追加の変換を実行したい場合はTransformerFactoryを再利用できますが、新しいスタイルシートに連結された別のTransformerインスタンスを作成する必要があります。

変換の実行

すべての準備が整ったら、変換を実行するコードがもう1行だけ必要です。リスト5に、transform() メソッドの使用方法を示します。ここには単に入力XMLと出力シンクを指定します。スタイルシートはすでに、使用するTransformerインスタンスに連結されています。

リスト5.transform() メソッドの使用
try {
  // Set up input documents
  Source inputXML = new StreamSource(
    new File("phonebook.xml"));

  Source inputXSL = new StreamSource(
    new File("phonebook.xsl"));

  // Set up output sink
  Result outputXHTML = new StreamResult(
    new File("output.html"));

  // Setup a factory for transforms
  TransformerFactory factory = TransformerFactory.newInstance();

  // Get a transformer for this XSL
  Transformer transformer = factory.newTransformer(inputXSL);

  // Perform the transformation
  transformer.transform(inputXML, outputXHTML);

} catch (TransformerConfigurationException e) {
  System.out.println("The underlying XSL processor " +
    "does not support the requested features.");
} catch (TransformerException e) {
  System.out.println("Error occurred obtaining " +
    "XSL processor.");
}

このメソッドを呼び出すと、指定されたResultに変換結果が書き込まれます。リスト5ではファイルが使われていますが、出力をSAXContentHandlerやDOMNodeに送信することも可能です。これらすべてを試したい場合は、バンドル・ファイルで提供されている単純なXMLファイル、XSLスタイルシート、およびソース・コードを利用してください ダウンロードを参照してください)。


XSLスタイルシートのキャッシュ処理

ここまで見てきたように処理自体は単純ですが、JAXPをこのように使用する場合は、重要な制限が2つあります。

  • Transformerオブジェクトは、transform() が実行されるたびにXSLスタイルシートを処理します。
  • Transformerのインスタンスはスレッドセーフではありません。複数のスレッド間で同一のインスタンスを使用することはできません。

これらの制限は、どちらも同じ問題に由来します。Transformerは、変換を実行するたびにXSLを処理し直す必要があります。この処理が複数のスレッドで発生すると、深刻な問題が起こる可能性があります。また、スレッディングの問題に加えて、XSLスタイルシートの処理コストも繰り返し発生してしまいます。それでは、これらの問題を解決するにはどうしたらよいのでしょうか。

テンプレートのロード

javax.xml.transform.Templatesの右隣には、まだ説明していないインターフェースjavax.xml.transform.Transformerがあります。Templatesインターフェースはスレッドセーフであり (2番目の制限事項を解決)、コンパイルされたスタイルシートを表しています (1番目の制限事項を解決)。関連する概念を説明する前に、リスト6を確認してください。

リスト6. JAXPTemplatesインターフェースの使用
try {
  // Set up input documents
  Source inputXML = new StreamSource(
    new File("phonebook.xml"));

  Source inputXSL = new StreamSource(
    new File("phonebook.xsl"));

  // Set up output sink
  Result outputXHTML = new StreamResult(
    new File("output-templates.html"));

  // Setup a factory for transforms
  TransformerFactory factory = TransformerFactory.newInstance();

  // Pre-compile instructions
  Templates templates = factory.newTemplates(inputXSL);

  // Get a transformer for this XSL
  Transformer transformer = templates.newTransformer();

  // Perform the transformation
  transformer.transform(inputXML, outputXHTML);

} catch (TransformerConfigurationException e) {
  System.out.println("The underlying XSL processor " +
    "does not support the requested features.");
} catch (TransformerException e) {
  System.out.println("Error occurred obtaining " +
    "XSL processor.");
}

リスト6の太字の行は、リスト5のコードから変更する必要のある箇所を表しています。ここでは、ファクトリーを使用してTransformerを直接取得するのではなく、newTemplates() メソッドを使用します。このメソッドによって返されるTemplatesオブジェクトはスレッドセーフなので、このオブジェクトを他のメソッドや他のオブジェクトに渡しても心配ありません。このオブジェクトは、渡されたXSLからの変換命令を事前にコンパイルするため、他のメソッドやスレッドに渡しても安全です。

次に、Templates.newTransformer() メソッドからTransformerインスタンスを取得します。Transformerがすでに処理を行っているため、この段階でXSLを指定する必要はありません (また、実際にはこのXSLがコンパイルされているため、スタイルシートを変更しようとしても変更できません)。ここでは、追加した行と既存の行に加えた変更以外に新しい処理はありません。わずかな変更ですが、これによって非常に便利なコードになります。

TransformerからTemplatesへ

考慮すべき最後の問題として、ファクトリーからTransformersを直接使用すべき場合と、Templatesオブジェクトを使用すべき場合があります。筆者がXSLを使用する際には、同じスタイルシートを繰り返し使用することが普通なので、Templatesオブジェクトを使用する場合がほとんどです。XSL上で何度も受け渡しを行うことを考えると、命令をTemplatesオブジェクトに事前コンパイルして、XSL処理で実行する方が便利です。

それほど一般的ではありませんが、TransformerFactoryからTransformerを直接取得した方が良い場合もあります。Templatesオブジェクトに事前コンパイルするとオーバーヘッドが多少余計にかかるため、特定のスタイルシートを使用して変換を1回しか実行しないことがわかっている場合は、事前コンパイルしない方が速く済みます。ただしこの場合は、再利用する予定がないことを確認してください。筆者が行ったテストでは (使用したサンプル・サイズが小さいので全く非科学的ですが)、1つのXSLスタイルシートを2回使用したところ、Templatesオブジェクトを使用した場合、処理速度が上がった分が事前コンパイルにかかるオーバーヘッドによって相殺されるため、Transformerを直接使用した場合とほとんど差はありませんでした。しかしこれが3回であれば、Templatesオブジェクトを使用した方が便利なのは間違いないでしょう。スレッディングの問題がないことも確認する必要がありますが、これは判断しやすいことなので、プログラミングに適用するかどうかは読者の方々にお任せします。一般的なルールとしては、ほとんどの場合においてTemplatesオブジェクトを使用した方が安全です。


XSLプロセッサの変更

第1回では、システム・プロパティーを変更することで、デフォルトのJAXPパーサーの実装を独自の実装に置き換えられることを説明しました。これと同じ原理がXSLプロセッサーにも当てはまります。JAXPのパッケージには、筆者も頻繁に利用する Xalan-J (参考文献を参照) が付属しています。JAXPは常に高い柔軟性を提供します。

Xalan 以外のプロセッサーを使用する場合は、javax.xml.transform.TransformerFactoryというシステム・プロパティーに値を指定してください。このプロパティーには、インスタンスを生成するクラスの名前を割り当てる必要があります。このクラスによってjavax.xml.transform.TransformerFactoryが拡張され (もちろんこれは、設定するシステム・プロパティーの名前でもあります)、抽象メソッドが埋め込まれます。次に例を示します。

java -Djavax.xml.transform.TransformerFactory=[transformer.impl.class] TestTransformations 
      simple.xml simple.xsl

これで完了です。


まとめ

登場した当初のJAXPは、SAXやDOM、およびこうしたAPIの旧バージョンの上位層としては貧弱なものでした。現在のJAXP 1.3では、ベンダー固有のコード行を記述しなくても、XMLの解析、検証、変換を行うことができるようになりました。SAXコードに落としたり、DTDParser (参考文献を参照) などのツールを使用したり、ユーザー自身で変換を処理したりすることが妥当な場合もありますが、手持ちのAPIやツールの中にJAXPも加えておくべきです。ベンダーに依存しないという特長よりもさらに重要なことは、最近のJava Virtual Machine (JVM) を使用している顧客やクライアントが、皆JAXPの使用を検討しているということでしょう。だからこそ、JAXPを使いこなし、頻繁に利用することをお勧めします。


ダウンロード

内容ファイル名サイズ
サンプル・コードx-jaxp2-all-about.zip4KB

参考文献

  • この2回シリーズの記事の、第1回を読んでください。JAXPと、その構文解析機能と検証機能を紹介しています。
  • Brett McLaughlinがホストしている「XML and Java technology」フォーラムを見てください。これらの技術を扱う上での情報が豊富に提供されています。
  • SunのJava and XML headquartersで、JAXPに関して学んでください。
  • Javaプログラミングに慣れていない人は、Java 5.0をダウンロードすれば、完全なJDKと共にJAXPを入手することができます。
  • W3C(World Wide Web Consortium)から、XSL標準に関する全てを入手してください。
  • SunのJDK 5.0実装におけるXSLプロセッサーである、Apache Xalanをダウンロードしてください。
  • SunはJDK 5.0実装の中でApache Xercesパーサーを使っています。
  • JAXP 1.3の新機能を詳しく知るために、2回シリーズのdeveloperWorksの記事「JAXP 1.3は何が新しいのか?」を読んでください。第1回(2004年11月)は、JAXP仕様の概要とjavax.xml.parsersパッケージに加えられた変更の詳細、強力なスキーマ・キャシュと検証フレームワークなどを解説しています。第2回(2004年12月)は、XML仕様での名前空間で定義される概念のサポートを追加したユーティリティーと、javax.xml.transformパッケージに加えられた変更に触れています。
  • 今やJAXPの一部となっている、Transformation API for XML (TrAX) について読んでください。
  • Putting XSL transformations to work」(developerWorks, 2001年10月)はXSLを紹介し、実世界でのビジネス・シナリオでXSL変換を使う利点について解説しています。
  • Brett McLaughlin著によるJava & XML(2001年O'Reilly & Associates刊)を読んでください。XMLを使ってWebベースのエンタープライズ・アプリケーションを構築するために、Javaプログラマーがどうすべきかを説明しています。
  • JAXPのベールの下に隠れたAPIに関して学んでください。まずSAXのWebサイトでSAX 2 for Javaを、次に、W3CのWebサイトでDOMを見てください。
  • オープン・ソースのツールキットであるJDOMについて学んでください。JDOMによって、Java言語の中でXML文書を表現できるようになり、また容易に、かつ効率的にXML文書を読み、書き、操作できるようになります。
  • 実用的なXML: 処理命令およびパラメーター」(developerWorks, 2001年9月)を読んで、単純なコンテンツ管理システムで複数のスタイルシートを使う方法を学んでください。
  • Doug TidwellによるdeveloperWorksのチュートリアル「XML programming in Java technology, Part 1」(2004年1月)を読んで、Java技術を使ってXML文書を扱うための基礎を学んでください。Part 2(2004年1月)は、名前空間やXML文書の検証、典型的なXML文書無しにXML構造を構築する方法など、より複雑な話題を取り上げています。最後に、Part 3(2004年7月)では、XMLデータ構造の生成や、こうした構造の操作、XMLパーサーと非XMLデータ・ソースとのインターフェースなど、さらに高度な課題を解説しています。
  • 検証APIを通してではなく、直接DTDを扱うパーサーに関心がある人は、Mark Wutkaによる手軽なDTDParserを調べてみてください。
  • developerWorksのDeveloper Bookstoreには、XML関連の技術書が豊富に取り揃えられていますので、ぜひご覧ください。
  • XMLおよび関連技術においてIBM認証開発者になる方法については こちら を参照してください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Java technology
ArticleID=239894
ArticleTitle=JAXPのすべて 第2回
publish-date=05312005