【簡単】PowershellでXML構造ファイルをオブジェクト化して読み込む

PowershellではXMLファイルを簡単に扱うことができます。XMLファイルを見やすく別のファイルに保存するときなどに利用します。

XMLファイルの内容をオブジェクトにする

XMLの構造はツリー構造です。フォルダ構造とほぼ同じなのでフォルダのPAHTを記載するようにデータにアクセスします。

例えばPATHをオブジェクト風に記載すると以下のようになります。
・PATH
C:/Users/test/Desktop/test

・オブジェクト風
pathObj.Users.test.Desktop.test

では実際にpowershellを利用しXMLをオブジェクト化します。
以下のサンプルXMLをデスクトップにtest.xmlファイルとして保存してください。

サンプルXML

<TestList version="2" revision="1">
	<Item category="test">
		<ID type="int">1</ID>
		<Name type="string">テスト1</Name>
		<Description type="text">テスト1の内容</Description>
		</Item>
	<Item category="test">
		<ID type="int">2</ID>
		<Name type="string">テスト2</Name>
		<Description type="text">テスト2の内容</Description>
	</Item>
	<Item category="test">
		<ID type="int">3</ID>
		<Name type="string">テスト3</Name>
		<Description type="text">テスト3の内容</Description>
	</Item>
	<Item category="news">
		<ID type="int">4</ID>
		<Name type="string">ニュース1</Name>
		<Description type="text">ニュース1の内容</Description>
	</Item>
	<Item category="news">
		<ID type="int">5</ID>
		<Name type="string">ニュース2</Name>
		<Description type="text">ニュース2の内容</Description>
	</Item>
	<Item category="news">
		<ID type="int">6</ID>
		<Name type="string">ニュース3</Name>
		<Description type="text">ニュース3の内容</Description>
	</Item>
</TestList>

コードを記載するためtest.ps1ファイルを作成します。

test.ps1を右クリック→編集をクリックしファイルを開きます。
以下のコードをコピペします。

# 現在のパス取得
$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

# xmlファイルのPATH
$source = "$scriptPath\test.xml"

# xmlオブジェクト作成
$xmlObj = (Get-Content -path "$source")
# データはループさせて取得
foreach ($List in $xmlObj.TestList) {
        foreach ($item in $List.Item) {
            echo $item.Name.innerText
        }
}

説明

1.オブジェクト化

$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$source = "$scriptPath\test.xml"
$xmlObj = (Get-Content -path "$source")

XMLファイルをオブジェクト化するためXMLファイルのPATHを取得します。
ファイルのデータを一行づつ取得するGet-Contentコマンドに使用します。これでは普通テキストファイルのような処理になっていまいますのでXMLを扱えるように全体をXMLにキャストします。

2.要素の値を取得

foreach ($List in $xmlObj.TestList) {
    foreach ($item in $List.Item) {
       echo $item.Name.innerText
    }
}

要素の値を取得する場合はinnerTextプロパティを使用します。
オブジェクト.innerText

3.属性の値を取得

foreach ($List in $xmlObj.TestList) {
    foreach ($item in $List.Item) {
       echo $item.GetAttribute("category")
    }
}

属性の値を取得する場合はGetAttributeメソッドを使用します。
オブジェクト.GetAttribute(“属性名”)

特定の条件により処理する

if文を利用し特定の条件にマッチした値のみ取得します。
例ではItemのcategory属性の値が「test」になっている要素の値を取得します。

# 現在のパス取得
$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

# xmlファイルのPATH
$source = "$scriptPath\test.xml"

# xmlオブジェクト作成
$xmlObj = (Get-Content -path "$source")
# データはループさせて取得
foreach ($List in $xmlObj.TestList) {
        foreach ($item in $List.Item) {
            if($item.GetAttribute("category") -eq "test"){
             echo $item.Name.innerText
             }
        }
}
自由な働き方をしてみませんか
フリーランスといえばクラウドソーシングが連想されると思います。 しかし「クラウドワークス」や「ランサーズ」調べてみると仕事の単価が非常に安い。 せっかく身につけた技術力がクラウドソーシングでは全く価値がなくなってしまいます。
そこでオススメなのがリモートワークの案件が多く翌月15日報酬として振り込まれる
クラウドテック」です。 掲載案件では平均月60万週3~4日勤務の案件が豊富生活スタイルに合わせた働き方を設計できます。 また福利厚生が充実し旅行、レジャー、家事代行、ヘビーシッター、健康診断など100種類以上を無料で使えます。
  • 97%がリモートのお仕事
  • 週4日、週3日OKのお仕事多数
  • 登録社数74万件業界トップクラス
  • 2〜4週間程度でお仕事決定
まだ間に合います。まずは無料登録をして自分に合った案件がないか確認してみてください。きっと魅力的な案件が見つかることでしょう。

シェアする

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

フォローする