SHOEISHA iD

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

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

Windows PowerShell 活用編

Windows PowerShell 活用編(10)
XPathNavigatorクラスの活用2

  • このエントリーをはてなブックマークに追加

ダウンロード population.zip (484.0 B)

 前回に引き続きXPathNavigatorによるXMLファイル操作について説明します。今回はXMLデータ内の移動、データの編集、削除を解説します。

  • このエントリーをはてなブックマークに追加

はじめに

 前回に引き続き、XPathNavigatorを利用したXMLファイル操作方法について説明します。今回は特に、XMLデータ内の移動、データの編集、削除について説明します。

 サンプルのコードを動作させるには、記事に添付されている「population.xml」を使用します。必要に応じて「population.zip」をダウンロードし、解凍してお使いください。

対象読者

  • Windows PowerShellの基本操作が行える方。
  • XMLについて基本知識を有する方。

サンプルファイルについて

 サンプルの「population.xml」は、県別の人口データを格納したファイルとなっています(説明用に作成したものです)。

 データには、ルート要素として<population_data>、子として1つの県を表す<prefecture>要素があります。<prefecture>には属性districtがあり、これは地方を表しています。

 また<prefecture>は子として県名を表す<name>と人口を表す<population>を持ちます。さらに、岩手県を表す要素には子要素として<municipality>を持ち、市町村名を表す<name>と人口を表す<population>があります。

 構成は下記の通りです。

<population_data> <!-- ルート要素 -->
    <prefecture district="地方名">  <!-- 1つの県を表す -->
        <name>県名</name>
        <population>人口</population>
        <municipality> <!-- 岩手県のところだけにある要素 -->
            <name>市町村名</name>
            <population>人口</population>
        </municipality>
    </prefecture>
</population_data> 

データの変更

データの変更が可能なXPathNavigatorを作成する

 XPathNavigatorは、XmlDocumentまたはXPathDocumentから作成することができます。しかし、データを変更できるのはXmlDocumentから作成されたXPathNavigatorオブジェクトに限定されています。よって、データの編集が可能なXPathNavigatorは、下記のようにXmlDocumentオブジェクトから作成します。

PS> $xmlDoc = [xml](Get-Content population.xml -Encoding UTF8)
PS> $Navi = [Xml.Xpath.XPathNavigator] $XmlDoc.CreateNavigator()

 現在のXPathNaigatorオブジェクトがデータの編集を可能としているかどうかは CanEditプロパティを調べることでわかります。この値は読み取り専用であり、変更することができません。またXmlDocumentから作成されたXPathNaigatorTRUEを返します。

PS> $Navi.CanEdit

値の変更

 まずは要素の値を変更する方法について説明します。

全県の人口を表す値を0にする

 県の人口を表すデータが格納されているのは XPath式で表すと

/population_data/prefecture/population

となります。前回の記事で説明したように、このXPath式をSelectメソッドの引数に渡して1つずつ処理を行います。

 また、値の変更はSetValueメソッドで行います。引数には変更後の値をセットします。下記は、すべての県の人口データを$nodesに格納した後、1件ずつ「0」をセットします。

$nodes = $Navi.Select("/population_data/prefecture/population")
While ( $nodes.MoveNext() )
{
  $nodes.Current.SetValue("0")
} 

 値が変更されたかどうかをInnerXmlプロパティで確認します。

PS> $Navi.InnerXml

 結果から、すべての県の人口が0に変更されていることを確認できます。

特定の属性を持つ要素の値変更

 ここでは特定の属性を持つ要素の値を変更する方法について説明します。

属性 district が"関東"の人口データを0にする

 属性districtは地方を表しており、サンプルデータには「東北」と「関東」の2種類があります。

 districtが「関東」になっているデータの人口を0にするには、XPath式で 

"/population_data/prefecture[@district='関東']/population"

 を指定し、Whileループで1件ずつ「0」をセットします。

$nodes = $Navi.Select("/population_data/prefecture[@district='関東']/population")
while($nodes.MoveNext())
{
  $nodes.Current.SetValue("0")
}

 値が変更されたかどうかをInnnerXmlプロパティで確認します。

PS> $Navi.InnerXml

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
XMLDocument内の移動

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

  • このエントリーをはてなブックマークに追加
Windows PowerShell 活用編連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3851 2009/05/11 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング