Powershellで簡単にXMLデータを操作する(要素の値・属性の値・複数要素の値・指定した属性値の要素の値の取得)

2020-09-15


はじめに

PowerShellを利用して、XMLファイルを読み込みデータを取得する方法はいろいろありますが、今回はとても簡単にXMLデータを取得する方法の備忘録です。

実行環境

本スクリプトを作成した時の環境は下記の通り

項目 バージョン
PS Version 5.1.17763.1007
OS Windows 10 1809 Enterprise 64bit
.Net Framework 4.7.2

サンプルXMLファイル

下記のようなパターンのXMLファイルを用意します。

sample.xml

<?xml version="1.0" encoding="utf-8" ?>
<sample>
    <target>target1</target>
    <content>
        <id>1</id>
        <title>タイトル</title>
        <description type="ja">説明</description>
    </content>
    <items1>
        <item>sample1</item>
        <item>sample2</item>
    </items1>
</sample>

XMLデータの取得

用意したサンプルXMLを読み込むサンプルスクリプトです。

$desktop = [Environment]::GetFolderPath("Desktop")
$xmlPath = Join-Path $desktop "sample.xml"

$xmlDoc = [System.Xml.XmlDocument](Get-Content -Encoding UTF8 -Raw $xmlPath)

# 要素の取得(ユニーク)
$target = [string]$xmlDoc.sample.target
Write-Host "target : $target"

# サブ要素の取得(ユニーク)
$id    = [string]$xmlDoc.sample.content.id
$title = [string]$xmlDoc.sample.content.title
Write-Host "id : $id"
Write-Host "title : $title"

# 属性値の取得
$description = [string]$xmlDoc.sample.content.description.'#text'
$type        = [string]$xmlDoc.sample.content.description.Attributes["type"].'#text'
Write-Host "description : $description"
Write-Host "type : $type"

# 複数要素の値の取得
$items = $xmlDoc.sample.items1.item
$itemsArr = @()
if($items.Count -gt 1) {
    for($i = 0; $i -lt $itmes.Count; $i++) {
        $itemsArr += [string]$items[$i]
    }
} else {
    $items += [string]$items
}
Write-Host "items(1) : $items[0]"
Write-Host "items(2) : $items[1]"

上記を実行した結果、下記の通りです

target : target1
id : 1
title : タイトル
description : 説明
type : ja
items(1) : sample1
items(2) : sample2

最後に

とても簡単にXMLデータを処理することができました。
注意点としては、多重度が「1..*」の要素です。
要素が1つの場合は、配列で取得すると、一文字ずつ配列に入ってしまうため分岐させています。

<items>sample1</items>

上記のみの場合に配列で取得すると $items[0] に入るのは 「s」のみとなります。
しかし、下記のように複数存在する場合は先ほどのサンプルスクリプトのようにそれぞれのテキストデータが配列に入ります。