【簡単】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
             }
        }
}

シェアする

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

フォローする