ノード(要素)の新規作成
ここでは、要素を例として、ノードを新規に作成する場合の例を紹介します。
ノードの作成位置
新規作成ノードを子ノードとして作成するか、兄弟ノードとして作成するかは、location属性に指定します。
子ノード(要素)の新規作成
カレントノード(要素)に子ノード(要素)を新規に作成するには、location属性にfirstchild、lastchild、insertを指定します。
以下が要素の新規挿入処理のXUGです。要素値が「井口資仁」のplayer要素をplayers要素の一番最後の子要素として新規に作成します。
<?xml version="1.0" encoding="UTF-8"?> <xlnupdate version="1.0"> <update select="/players"> <element location="firstchild"> <player backnumber="15" position="内野手">井口資仁</player> </element> </update> </xlnupdate>
以下が実行結果のXMLとなります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="15" position="内野手">井口資仁</player> <player backnumber="51" position="外野手">イチロー</player> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> </players>
location属性に「lastchild」を指定すると以下のXMLのようにplayers要素の一番最後に要素が新規作成されます。なお「insert(カレントノードに子ノードを新規に挿入)」を指定した場合も同じ結果となります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="51" position="外野手">イチロー</player> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> <player backnumber="15" position="内野手">井口資仁</player> </players>
兄弟ノード(要素)の新規作成
カレントノードに兄弟要素を新規に作成するには、location属性にbeforeまたはafterを指定します。要素値が「松井秀樹」であるplayer要素の前(before)に要素値が「井口資仁」の要素を新規に作成します。
<?xml version="1.0" encoding="UTF-8"?> <xlnupdate version="1.0"> <update select="/players/player[.='松井秀樹']"> <element location="before"> <player backnumber="15" position="内野手">井口資仁</player> </element> </update> </xlnupdate>
以下が実行結果のXMLとなります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="51" position="外野手">イチロー</player> <player backnumber="15" position="内野手">井口資仁</player> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> </players>
ここで、location="after"を指定すると、select="/players/player[.='松井秀樹']"で指定した要素の弟ノード(next-sibling)に要素が新規作成されます。
ノード(要素)の更新(replace)
要素を更新する場合には、新規作成・更新ノード指定用要素のlocation属性にreplaceを指定します。loacation属性の指定を省略した場合のデフォルト値として、replaceが使用されます。
<xlnupdate version="1.0"> <update select="/players/player[.='イチロー']/text()"> <element location="replace">ICHIRO</element> </update> </xlnupdate>
以下が実行結果のXMLとなります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="51" position="外野手">ICHIRO</player> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> </players>
ノード(要素)のコピー(copy)・移動(move)
ノードをコピーする場合には、新規作成・更新ノード指定用要素のcopyfrom属性にコピー元ノードのXPath式を指定します。ノードを移動する場合には、新規作成・更新ノード指定用要素のmovefrom属性に移動元ノードのXPath式を指定します。以下が、ノード(要素)を移動するXUGの例です。要素値が「イチロー」であるplayer要素を要素値が「松坂大輔」であるplayer要素の後(after)に移動(move)します。
<xlnupdate version="1.0"> <update select="/players/player[.='松坂大輔']"> <element location="after" movefrom="/players/player[.='イチロー']"> </element> </update> </xlnupdate>
以下が実行結果のXMLとなります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> <player backnumber="51" position="外野手">イチロー</player> </players>
ノード(要素)の削除(remove要素)
ノードを削除するにはremove要素を使用します。以下がノード(要素)を削除するXUGの例です。要素値が「松坂大輔」であるplayer要素を削除します。
<xlnupdate version="1.0"> <remove select="/players/player[.='松坂大輔']"/> </xlnupdate>
以下が実行結果のXMLとなります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="51" position="外野手">イチロー</player> <player backnumber="55" position="外野手">松井秀樹</player> </players>
繰り返し(foreach要素)
foreach
複数のノードに対して同じ処理を繰り返す場合には、foreach要素を使用します。foreach要素は入れ子にすることが可能です。
<?xml version="1.0" encoding="UTF-8"?> <xlnupdate version="1.0"> <foreach select="/players/player"> <update select="./@backnumber" location="replace"> <attribute name="backnumber">0</attribute> </update> </foreach> </xlnupdate>
以下のXMLが実行結果となります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="0" position="外野手">松井秀樹</player> <player backnumber="0" position="投手">松坂大輔</player> <player backnumber="0" position="外野手">イチロー</player> </players>
from、document
from要素は、複数のXML文書を更新するために用意されている要素です。from要素は、foreach要素の直下にある必要があり、select属性にXPath式を記述し、複数XMLドキュメントに対してカレントノードを設定します。document要素はupdate要素の操作対象となるXML文書を指定するための要素です。filepath属性で、XMLファイル名、storename属性にXMLドキュメントが保存されているXMLストア名を指定します。
以下の例は「test_xmlstore」という名前のXMLストアの「/test_dir/players.xml」と「/test_dir/players2.xml」いう2つのXMLファイルを更新する例です。player要素のbacknumber属性をすべて0で更新しています。
<?xml version="1.0" encoding="UTF-8"?> <xlnupdate version="1.0"> <foreach> <from select="/players/player"> <document filepath="/test_dir/players.xml" storename="test_xmlstore"/> <document filepath="/test_dir/players2.xml" storename="test_xmlstore"/> </from> <update select="./@backnumber" location="replace"> <attribute name="backnumber">0</attribute> </update> </foreach> </xlnupdate>
以下のXMLが実行結果となります。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="0" position="外野手">イチロー</player> <player backnumber="0" position="外野手">松井秀樹</player> <player backnumber="0" position="投手">松坂大輔</player> </players>
複数ドキュメントの更新
XUGでは、1回の実行で複数のXMLドキュメントを扱うことができます。以下に複数のXMLドキュメントを更新する例を紹介します。以下がXUGです(players.xml、players2.xmlで同じ内容)。
<?xml version="1.0" encoding="UTF-8"?> <xlnupdate version="1.0"> <foreach> <from select="/players/player[.='イチロー']/text()"> <document filepath="/test_dir/players.xml"/> <document filepath="/test_dir/players2.xml"/> </from> <update> <text>ICHIRO</text> </update> </foreach> </xlnupdate>
from要素のselect属性で抽出条件をXPathで指定し、その子要素のdocument要素のfilepath属性で処理対象のXMLドキュメント名を指定しています。storename属性が省略されている場合は、XMLストアはカレントのXMLストアが適用されます。
以下のXMLが実行結果となります。実際には2つのXMLドキュメントが更新されます。
<?xml version="1.0" encoding="UTF-8"?> <players> <player backnumber="51" position="外野手">ICHIRO</player> <player backnumber="55" position="外野手">松井秀樹</player> <player backnumber="18" position="投手">松坂大輔</player> </players>
まとめ
本稿ではCyber Luxeonで用意しているXML更新機能のXUGについて説明しました。XUGはXMLの更新処理をシンプルかつ強力に記述できる機能を備えています。XUGを活用することによって、XMLの更新処理を迅速に開発することができます。本稿がXUGの学習時、そして実際にXMLアプリケーションを開発時の、リファレンスとしての役割を果たすことができれば幸いです。
参考資料
- 『Cyber Luxeon ハンドブック』 サイバーテック社
