ノード(要素)の新規作成
ここでは、要素を例として、ノードを新規に作成する場合の例を紹介します。
ノードの作成位置
新規作成ノードを子ノードとして作成するか、兄弟ノードとして作成するかは、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 ハンドブック』 サイバーテック社
この記事は参考になりましたか?
既に会員の方はを行ってください。
- Cyber Luxeonで学ぶXMLDB入門連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
