SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cyber Luxeonで学ぶXMLDB入門

XMLデータの操作(後編) ~ XML updategramの基本

Cyber Luxeonで学ぶXMLDB入門 第3回


ノード(要素)の新規作成

 ここでは、要素を例として、ノードを新規に作成する場合の例を紹介します。

ノードの作成位置

 新規作成ノードを子ノードとして作成するか、兄弟ノードとして作成するかは、location属性に指定します。

子ノード(要素)の新規作成

 カレントノード(要素)に子ノード(要素)を新規に作成するには、location属性にfirstchild、lastchild、insertを指定します。

 以下が要素の新規挿入処理のXUGです。要素値が「井口資仁」のplayer要素をplayers要素の一番最後の子要素として新規に作成します。

XUG要素の新規作成(location=”firstchild”を指定)
<?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となります。

要素の新規作成(location=”firstchild”を指定)の実行結果
<?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(カレントノードに子ノードを新規に挿入)」を指定した場合も同じ結果となります。

要素の新規作成(location=”lastchild”を指定)の実行結果
<?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)に要素値が「井口資仁」の要素を新規に作成します。

XUG要素の新規作成(location=”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となります。

要素の新規作成(location=”before”を指定)の実行結果
<?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が使用されます。

要素の更新(location=”replace”を指定)のXUG
<xlnupdate version="1.0">
    <update select="/players/player[.='イチロー']/text()">
        <element location="replace">ICHIRO</element>
    </update>
</xlnupdate>

 以下が実行結果のXMLとなります。

要素の更新(location=”replace”を指定)の実行結果
<?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)します。

要素の移動(movefrom属性を指定)のXUG
<xlnupdate version="1.0">
    <update select="/players/player[.='松坂大輔']">
        <element location="after" movefrom="/players/player[.='イチロー']">
        </element>
    </update>
</xlnupdate>

 以下が実行結果のXMLとなります。

要素の移動(movefrom属性を指定)の実行結果
<?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要素を削除します。

要素削除のXUG
<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要素は入れ子にすることが可能です。

複数要素の属性値を更新するXUG
<?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が実行結果となります。

複数要素の属性値を更新するXUGの実行結果
<?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で更新しています。

from,documentを使用したXUGの例
<?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が実行結果となります。

from,documentを使用したXUGの実行結果
<?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で同じ内容)。

XUG(複数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ドキュメントを更新したXUGの実行結果
<?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アプリケーションを開発時の、リファレンスとしての役割を果たすことができれば幸いです。

参考資料

  1. 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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1065 2007/06/13 10:07

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー