はじめに
PowerShellを利用して、XMLファイルを読み込みデータを取得する方法はいろいろありますが、今回はとても簡単にXMLデータを取得する方法の備忘録です。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
実行環境
本スクリプトを作成した時の環境は下記の通り
項目 | バージョン |
PS Version | 5.1.17763.1007 |
OS | Windows 10 1809 Enterprise 64bit |
.NET Framework | 4.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」のみとなります。
しかし、下記のように複数存在する場合は先ほどのサンプルスクリプトのようにそれぞれのテキストデータが配列に入ります。