1. トップ
  2. 新着ニュース
  3. IT
  4. パソコン

窓辺の小石 第177回 アキレウスのかかと

マイナビニュース / 2024年8月2日 14時24分

この状態では、XMLはPowerShellの通常のオブジェクトのように扱えるため、

$xml.main.sub | Where-Object name -eq 's1'

のようにPowerShellのコマンドでオブジェクトのように扱える。ただし、subとSUBタグは同一視されている。

正しい方法はSelect-Xmlコマンドを使うものだ。これは、XMLオブジェクト(System.Xml.XmlDocument)からXPathを使って、正しく要素を取り出すコマンドだ。subタグのname属性を見たいなら、

(Select-Xml -Xml $xml -XPath "//sub/@name").node

とする。Select-Xmlコマンドの出力は、SelectXmlInfoというオブジェクトなので、そのnodeプロパティを展開することで中身が得られる。XPathオプションの引数を"//SUB/@Name"にすると、SUBタグのName属性を取り出せる。このようにSelect-Xmlを使うことで、大文字小文字を区別したタグや属性値のアクセスが行える。

Select-Xmlコマンドでは、XPathを使う必要があり、コマンド記述が結構面倒である。文字ケースが違うだけのタグがなければ、簡易な方法が利用できる。パイプラインを使って、XMLファイルをまとめてPowerShellのオブジェクトに変換するのも簡単だ。PSCustomObjectに必要な情報のみを入れてしまえば、あとは、ConvertTo系のコマンドが利用できる。

以下のコマンドは、フォントのソースコード(Windows Terminal付属のCascadiaフォント)から、glifファイル(中身はXML)にあるユニコードのコードポイント定義(のようなタグ)を取り出すもる。XMLの要素からPowerShellのオブジェクトを生成、これをCSVに変換する。ここまでできると、あとの処理や分析は、エクセル(PowerQuery利用)などで簡単に行える。

$myxml=[Xml]::new()
Get-ChildItem -Recurse -Filter *.glif | %{ $myxml.Load($_.FullName); $u=$myxml.glyph.unicode.hex;if($u -ne $null){foreach($uc in $u){[pscustomobject]@{Unicode=$uc;Name=$myxml.glyph.name}}}} | sort Unicode | ConvertTo-Csv

この記事に関連するニュース

トピックスRSS

ランキング

複数ページをまたぐ記事です

記事の最終ページでミッション達成してください