著者: Ma Xiaoning
XML (Extensible Markup Language) は、ある種の w3c 標準のように見えるかもしれません。現時点では実用的な影響はなく、将来便利になるとしても、それはずっと後のことになります。しかし、実際にはすでに使われています。そのため、XML がお気に入りの HTML エディターに追加されるまで待たずに使用を開始できます。現在、社内のさまざまな問題や b2b システムの問題を解決できます。
Sparks.com では、XML を使用して、Java オブジェクトから HTML データ表示まで、さまざまなシステム間のデータ表現を標準化しています。
特に、データが非常に基本的な XML 構造で標準化されている場合、データの共有と操作がより簡単になることがわかりました。このプロセスで、XML を使用する多くの効果的な方法を発見しました。以下では、現在のアプリケーションについて詳しく説明します。
標準化 XML を使用する前に、使用する情報とは異なる XML データ形式を作成します。
動的XMLを生成する
データベースから HTML を生成することは新しいことではありませんが、XML を生成することは新しいことです。ここでは具体的な生成手順を紹介します。
テンプレート言語として xsl を使用する
XSL (Extensible Stylesheet Language) は XML データの表示形式を定義するのに適した方法であり、複数の静的テンプレートとして記述するとより効果的です。
HTMLの生成
xml と xsl は html と同じです。正しくないように聞こえるかもしれませんが、ユーザーに表示される HTML ページは、実際には xml と xsl の結果です。
1.
XML を標準化できるのは、その柔軟性によるものです。しかし、残念ながら、柔軟性が高すぎるため、どうやって問題を解決すればよいのか白紙のままになってしまうことがあります。
どの XML プロジェクトでも、最初のステップは標準データ形式を作成することです。これを行うには、次の決定を行う必要があります:
• どのようなデータが関係するか?
• dtd (ファイルタイプ定義) を使用するかどうか
データの
解析と決定に DOM (Document Object Model) と SAX (Simplified API for XML) のどちらを使用するか
:
標準の XML 形式がないため、開発者は独自の形式を自由に開発できます。ただし、形式が 1 つのアプリケーションでのみ認識される場合は、その形式を使用するためにそのアプリケーションのみを実行できます。 XML 形式を読み取ることができる他のプログラムがあれば、明らかに便利です。 XML 形式を変更すると、それを使用するシステムも変更する必要がある場合があるため、可能な限り完全な形式を構築する必要があります。ほとんどのシステムは認識できないタグを無視するため、XML の形式を変更する最も安全な方法は、タグを変更するのではなく追加することです。
XML データ形式の例を表示するには、ここをクリックしてください
。sparks.com では、さまざまな製品プレゼンテーションに必要なすべての製品データを調べました。すべてのページがすべてのデータを使用するわけではありませんが、すべてのデータに適した非常に完全な XML データ形式を開発しました。たとえば、製品詳細ページには、製品参照ページよりも多くのデータが表示されます。ただし、各ページの xsl テンプレートは必要なフィールドのみを使用するため、どちらの場合でも同じデータ形式を使用します。
dtdを使用するかどうか
Sparks.com では、単に正しい XML ではなく、よく整理された XML を使用します。前者は DTD を必要としないためです。 DTD は、ユーザーがクリックしてからページを表示するまでの間に処理レイヤーを追加します。このレイヤーには多大な処理が必要であることがわかりました。もちろん、XML 形式で他の企業と通信するときに DTD を使用するのは依然として良いことです。なぜなら、dtd は送受信時にデータ構造が正しいことを保証できるからです。
解析エンジンの選択 使用できる解析エンジンがいくつかあります。どちらを選択するかは、ほぼ完全にアプリケーションのニーズによって決まります。 DTD を使用する場合は、解析エンジンが XML を DTD で検証できるようにする必要があります。検証を別のプロセスに入れることもできますが、パフォーマンスに影響を及ぼします。
Sax と dom は 2 つの基本的な解析モデルです。 SAX はイベントベースであるため、XML が解析されるとイベントがエンジンに送信されます。次に、イベントが出力ファイルと同期されます。 DOM 解析エンジンは、動的 XML データと XSL スタイル シートの階層ツリー構造を確立します。 DOM ツリーにランダムにアクセスすることで、あたかも XSL スタイルシートで決定されたかのように XML データを提供できます。 SAX モデルに関する議論は主に、DOM 構造の過剰なメモリ削減と XSL スタイル シートの解析時間の高速化に焦点を当てています。
しかし、サックスを使用する多くのシステムでは、サックスがその機能を最大限に活用していないことがわかりました。これらのシステムは、これを使用して DOM 構造を構築し、DOM 構造を通じてイベントを送信します。このアプローチでは、XML 処理の前にスタイルシートから DOM を構築する必要があるため、パフォーマンスが低下します。
2. 動的 XML の生成
XML 形式が確立されたら、それをデータベースから動的に移植する方法が必要です。
XML ドキュメントの生成は、文字列を処理できるシステムのみが必要なため、比較的簡単です。 Javaサーブレット、エンタープライズJavaBeanサーバー、jdbc、rdbms(リレーショナルデータベース管理システム)を使用してシステムを構築しました。
• サーブレットは、XML ドキュメントを生成するタスクをエンタープライズ Javabean (ejb) にオフロードすることで、製品情報リクエストを処理します。
• ejb は jdbc を使用して、データベースから必要な製品の詳細をクエリします。
• ejb は XML ファイルを生成し、それをサーブレットに渡します。
サーブレットは解析エンジンを呼び出して、xml ファイルおよび静的 xsl スタイル シートから html 出力を作成します。
XML の生成例 Java で XML ドキュメント文字列を作成する実際のコードは、いくつかのメソッドとクラスに分割できます
。
XML 生成プロセスを開始するコードは、ejb メソッドに配置されます。このインスタンスは、生成された XML 文字列を保存するための文字列バッファをすぐに作成します。
文字列バッファ xml = 新しい文字列バッファ();
xml.append(xmlutils.begindocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toxml());
xml.append(xmlutils.enddocument("参照");
out.print(xml.tostring());
次の 3 つの xml.append() 変数自体は、他のメソッドへの呼び出しです。
ファイル ヘッダーの生成 最初の追加メソッドは、xmlutils クラスを呼び出して、xml ファイル ヘッダーを生成します。 Java サーブレットのコードは次のとおりです。
public static string begindocument(string stylesheet, string page)
{
文字列バッファ xml = 新しい文字列バッファ();
xml.append("<?xml version="1.0"?>n")
.append("<?xml-stylesheet href="")
.append(スタイルシート).append(""")
.append(" type ="text/xsl"?>n");
xml.append("<").append(page).append(">n");
xml.tostring() を返します。
この
コードは XML ファイル ヘッダーを生成します。 <?xml> タグは、このファイルをバージョン 1.0 をサポートする XML ファイルとして定義します。コードの 2 行目は、データを表示するための正しいスタイル シートの場所を指します。最後に含まれるのは項目レベルのタグ (この例では <browse>) です。ファイルの最後では、<browse> タグのみを閉じる必要があります。
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
製品情報を入力し、ファイル ヘッダーを完成させると、制御メソッドは Java オブジェクトを呼び出してその XML を生成します。この例では、product オブジェクトが呼び出されます。製品オブジェクトは 2 つのメソッドを使用して XML 表現を生成します。最初のメソッド toxml() は、<product> タグと </product> タグを生成して product ノードを作成します。次に、internalxml() を呼び出し、製品 XML に必要なコンテンツを提供します。 innerxml() は、一連の stringbuffer.append() 呼び出しです。文字列バッファも文字列に変換され、コントロール メソッドに返されます。
パブリック文字列 toxml()
{
stringbuffer xml = new stringbuffer("<製品>n");
xml.append(internalxml());
xml.append("</product>n");
xml.tostring() を返します。
文字
列internalxml()
{
文字列バッファ XML = 新しい
文字列バッファ("t")
.append(製品タイプ).append("n");
xml.append("t").append(idvalue.trim())
.append("n");
xml.append("t").append(idname.trim())
.append("n");
xml.append("t").append(page.trim())
.append("n");
パン?
xml.append("t").append(金額).append("n");
xml.append("t").append(ベンダー).append("n");
xml.append("tn");
xml.append("t").append(pubdesc).append("n");
xml.append("t").append(vendesc).append("n";
パン?
xml.tostring() を返します。
}
最後に、ファイルを閉じた後に xmlutils.enddocument() メソッドが呼び出されます。この呼び出しにより xml タグが閉じられ (この場合)、最終的に構造化 xml ファイルが完成します。制御メソッドからの文字列バッファ全体も文字列に変換され、元の http リクエストを処理したサーブレットに返されます。
3. xsl をテンプレート言語として使用します
。html 出力を取得するには、生成された xml ファイルを、xml データの表現方法を制御する xsl テンプレートと組み合わせます。当社の xsl テンプレートは、慎重に編成された xsl タグと html タグで構成されています。
テンプレートの構築を開始する xsl テンプレートの先頭は、以下のコードのようになります。コードの最初の行は必須であり、このファイルを xsl スタイル シートとして定義します。 xmlns:xsl= 属性は、このファイルで使用される XML 名前空間を参照し、version= 属性は名前空間のバージョン番号を定義します。ファイルの最後でタグを閉じます。
<xsl:template> で始まるコードの 2 行目は、xsl テンプレートのモードを決定します。 match 属性は必須であり、ここでは XML タグ <basketpage> を指します。私たちのシステムでは、<basketpage> タグに <product> タグが含まれており、これにより、xsl テンプレートが <product> タグに埋め込まれた製品情報にアクセスできるようになります。もう一度、ファイルの最後にある <xsl:template> タグを閉じる必要があります。
次に、よく整理された HTML を見てみましょう。 XML 解析エンジンによって処理されるため、適切に構成された XML のすべてのルールに準拠する必要があります。基本的に、これはすべての開始タグに対応する終了タグが必要であることを意味します。たとえば、通常は閉じられない <p> タグは、</p> で閉じる必要があります。
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/xsl/transform "
バージョン="1.0">
<xsl:template match="バスケットページ">
<html>
<頭>
<title>ショッピングバッグ / 数量を調整する</title>
</head>
<body bgcolor="#cccc99" bgproperties="fixed" link="#990000" vlink="#990000">
<br>
?br> </xsl:template>
</xsl:スタイルシート>
テンプレートの本文内には、データ表示のロジックを提供するために使用される xsl タグが多数あります。よく使用される 2 つのタグについて以下で説明します。
選ぶ
<xsl:choose> タグは、従来のプログラミング言語の if-then-else 構造の始まりに似ています。 XSL では、choose タグは、コードが入る部分で、割り当てによってアクションがトリガーされることを示します。属性が割り当てられた <xsl:when> タグがchooseタグの後に続きます。割り当てが正しい場合は、<xsl:when> の開始タグと終了タグの間の内容が使用されます。割り当てが間違っている場合は、<xsl:otherwise> の開始タグと終了タグの間の内容が使用されます。セクション全体は </xsl:choose> で終わります。
この例では、when タグが XML 内の数量タグをチェックします。数量タグに true の値を持つエラー属性が含まれている場合、数量タグには以下にリストされている表のセルが表示されます。属性の値が true でない場合、xsl はタグ間のコンテンツを表示します。以下の例では、error 属性が true でない場合、何も表示されません。
<xsl:選択>
<xsl:when test="quantity[@error='true']">
<td bgcolor="#ffffff"><img height="1" width="1" src="