PowerShellでXMLから目的の要素を探索する方法! | Where-Object, 比較演算子, 論理演算子
この記事では、PowerShellでXMLファイルを読み込み、読み込んだXMLファイルから目的の要素を探索する方法について記載します。
サンプルはいつものXML(books.xml)を使います。
<?xml version="1.0" encoding="utf-8"?>
<books>
<book isbn="0123456789">
<title>ぶろぐはじめました</title>
<author>kissy</author>
<date>2017-09-02</date>
</book>
<book isbn="abcdefghij">
<title>PowerShellはじめました</title>
<author>kissy</author>
<date>2017-09-03</date>
</book>
<book isbn="987654321" tag="new">
<title>twitterはじめました</title>
<author>foo</author>
<date>2016-09-01</date>
</book>
</books>
PowerShellでXMLから目的の要素を探索する方法はいくつかあります。
- XMLの要素を探索する方法
-
- Where-Objectで絞り込む
- XPathを使って絞り込む
今回はWhere-Objectを使ってみます。
Where-ObjectでXMLを絞り込む
XMLの読み込むときは、Get-Contentを使うのでしたね。読み込んだXMLから、Where-Objectを使ってauthor要素が"kissy"のbook要素に絞ってみます。
$xmldoc = [xml](Get-Content "c:\\temp\\books.xml")
$xmldoc.books.book | Where-Object {$_.author -eq "kissy"}
これだけです。
最初の$xmldoc.books.book
でbooks要素配下のbook要素に絞り込んでいます。
例のXMLではbook要素は3つあるので、book要素のサイズ3の配列になります。
これをパイプ(|)を使って、Where-Objectに渡してさらに絞り込みます。
Where-Objectでは、books要素の配列を順次処理していきます。
$_はbooks要素の配列の1つの要素を表します。
for(i=0; i< 10; ++i)
のiのようなイメージですね。
Where-Objectの条件で、autherが"kissy"と等しいかをチェックしています。
Where-ObjectでXMLを絞り込む(複数条件)
先ほどは、1つの条件で絞り込みを行いましたが、複数の条件で絞り込む場合は、-And
または-Or
を使います。
試してみましょう。author要素が"kissy"で、かつ、title要素が"ぶろぐ"で始まるものに絞り込みます。
$xmldoc = [xml](Get-Content "c:\\temp\\books.xml")
$xmldoc.books.book | Where-Object {($_.author -eq "kissy") -And ($_.title -like "ぶろぐ*"}
上記のサンプルでは、条件判断にeq
とlike
を使用していますが、条件判断に使用する比較演算子には、他にもあります。
以下に比較演算子の一覧を記載します。
比較演算子 | 説明 |
---|---|
-eq | 等しい(=) |
-ne | 等しくない(!=) |
-gt | より大きい(>) |
-ge | 以上(>=) |
-lt | より小さい(<) |
-le | 以下(<=) |
-like | ワイルドカードでの比較 |
-notlike | ワイルドカードでの比較(否定) |
-match | 正規表現での比較 |
-nomatch | 正規表現での比較(否定) |
C++など他の言語ではなど記号を使った演算子が使われることが多いですが、PowerShellではアルファベットとなっています。他言語をメインで使っていると、慣れるまでは上記表を見ながら実装するといいでしょう。
また、ワイルドカードや正規表現での比較のための演算子もあります。PowerShellって便利!
また、複数の条件判断に使用する論理演算子には、以下のようなものがあります。
論理演算子 | 説明 |
---|---|
-And | かつ(&&) |
-Or | または( |
-Not | ではない(!) |
指定した属性が存在する要素だけを探索する
XMLの属性は必ずあるというものではありません。ある要素には存在する属性も、他の要素では存在しないこともあります。
指定した属性がある要素だけを探索するには、$null
を使用します。指定した属性がない場合、オブジェクトは$null
となるので、これをつかって調べることができます。
以下はtag属性のあるbook要素を探索するのサンプルです。
$xmldoc = [xml](Get-Content "c:\\temp\\books.xml")
$xmldoc.books.book | Where-Object {$_.tag -ne $null}