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

はじめに

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

\自身のスキルを向上するには技術書で!!/

月額¥980で技術書が読み放題!!

  • ビジネススキルとマインド向上したい!!
  • 決断や行動を先送りにしてしまう方!!

Kindle Unlimitedでは30日間無料体験実施中!登録はこちら!

実行環境

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

項目バージョン
PS Version5.1.17763.1007
OSWindows 10 1809 Enterprise 64bit
.NET Framework4.7.2

サンプルXMLファイル

下記のようなパターンの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」のみとなります。
しかし、下記のように複数存在する場合は先ほどのサンプルスクリプトのようにそれぞれのテキストデータが配列に入ります。

タイトルとURLをコピーしました