第9章 Groovy スクリプト
9.1. Groovy リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Groovy は、Java 仮想マシン用のアジャイルで動的な言語であり、Java の長所に基づいて、構築されていますが、Python、Ruby、Smalltalk などの言語に触発された追加の強力な機能を備えています。
詳細については、http://groovy.codehaus.org/ を参照してください。
9.2. Groovy の例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Groovy スクリプトのサポートは、設定 namespace (http://www.milyn.org/xsd/smooks/groovy-1.1.xsd) で提供されます。 この namespace は、DOM および SAX ベースのスクリプトをサポートします。以下の例を参照してください。
<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:g="http://www.milyn.org/xsd/smooks/groovy-1.1.xsd">
<g:groovy executeOnElement="xxx">
<g:script>
<!--
//Rename the target fragment element from "xxx" to "yyy"...
DomUtils.renameElement(element, "yyy", true, true);
-->
</g:script>
</g:groovy>
</smooks-resource-list>
9.3. Groovy のヒント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- ビジットされた要素 は、適切な名前の変数によってスクリプトで使用できます。element(要素名と同じ変数名でも使用できますが、後者の名前が英数字に制限されている場合に限ります。)
- 前に実行/後に実行: デフォルトでは、visitAfter イベントの発生時、スクリプトが実行されます。executeBefore 属性を
trueに設定して、visitBefore で実行するように、指示します。 - コメント/CDATA スクリプトラップ: スクリプトに特殊な XML 文字が含まれている場合は、スクリプトを
XML CommentまたはCDATAセクションでラップできます。
9.4. Imports リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
imports 要素を使用して、インポート を追加します。多くのクラスが自動的にインポートされます。
org.milyn.xml.DomUtilsorg.milyn.javabean.context.BeanContext.Smooks 1.3 以降のみ。org.milyn.javabean.repository.BeanRepositoryorg.w3c.dom.*groovy.xml.dom.DOMCategorygroovy.xml.dom.DOMUtilgroovy.xml.DOMBuilder
9.5. Groovy で DOM と SAX の混合を使用する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Groovy は、DOM と SAX の混合モデルをサポートしています。Groovy の DOM ユーティリティーを使用して、対象のメッセージフラグメントを処理できます。SAX フィルターが使用されている場合も、Groovy スクリプトは、DOM の要素を受け取ります。これにより、SAX フィルターを使用する Groovy スクリプトがはるかに簡単になり、ストリーミング方式で巨大なメッセージを処理する機能が維持されます。
9.6. DOM と SAX の混合のヒント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
注意事項:
- デフォルトモードのみで使用できます (つまり、executeBefore が
falseに等しい場合)。executeBefore がtrueであるように設定されている場合、この機能は、利用できません。つまり、Groovy スクリプトは、SAXElement のみにアクセスできます。 - writeFragment は、DOM フラグメントを
Smooks.filterSource StreamResultに書き込むために、呼び出す必要があります。 - この DOM 構成機能を使用すると、パフォーマンスのオーバーヘッドが発生します。(巨大なメッセージを処理することはできますが、少し時間がかかる場合があります。妥協点は使いやすさとパフォーマンスの間です。)
9.7. DOM と SAX の混合の例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
手順9.1 タスク
- 次のサンプルのような XML メッセージを考えてみましょう。
<shopping> <category type="groceries"> <item>Chocolate</item> <item>Coffee</item> </category> <category type="supplies"> <item>Paper</item> <item quantity="4">Pens</item> </category> <category type="present"> <item when="Aug 10">Kathryn's Birthday</item> </category> </shopping> - 上記の買い物リストの消耗品カテゴリーを変更するには、さらに 2 つのペンを追加します。これを行うには、単純な Groovy スクリプトを記述し、メッセージの <category> 要素を対象とします。
- その結果、スクリプトは単純にカテゴリー内の <item> 要素を反復し、カテゴリータイプが「消耗品」で品目が「ペン」の場合、数量は 2 つ増加します。
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.3.xsd" xmlns:g="http://www.milyn.org/xsd/smooks/groovy-1.1.xsd"> <core:filterSettings type="SAX" /> <g:groovy executeOnElement="category"> <g:script> <!-- use(DOMCategory) { // Modify "supplies": we need an extra 2 pens... if (category.'@type' == 'supplies') { category.item.each { item -> if (item.text() == 'Pens') { item['@quantity'] = item.'@quantity'.toInteger() + 2; } } } } // When using the SAX filter, we need to explicitly write the fragment // to the result stream... writeFragment(category); --> </g:script> </g:groovy> </smooks-resource-list>