Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/05/11 14:00

ダウンロード 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

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

著者プロフィール

  • HIRO(ヒロ)

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

バックナンバー

連載:Windows PowerShell 活用編

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5