そのXMLの読み込み方は間違えている
はじめに
短いです
間違った(できるけど適切ではない?)情報がインターネット上に広まっていたので、自分用のメモも兼ねて書いてます
間違った箇所があればコメントお願いします
間違った(適切でない)方法
xmlオブジェクトへのキャストを用いた方法です
インターネット上で調べてすぐに出てくる方法はこちらかと思います
$xml = [xml](Get-Content "Path/To/XML.xml")
# or
[xml]$xml = Get-Content "Path/To/XML.xml"
良い方法
[System.Xml.XmlDocument]::Load()
を使用します
$xml = [xml]::new() # [xml] は [System.Xml.XmlDocument] のエイリアスです
$xml.Load("Path/To/XML.xml")
何が違うの?
前者はファイル読み込みを Get-Content
が担っているのに対し、後者は [xml]::Load()
がファイル読み込みからパースまでの全てを行っているのが大きな違いになります
xmlファイルの先頭には、XMLのバージョンや文字コードについての情報を持つXML宣言が記述されています
XMLファイルを読み込むときに使用する文字コードはこのXML宣言を参照したいのですが、 Get-Content
は(当たり前ですが)ここを参照してくれません
そのため、異なる文字コードで読み込まれたテキストデータがxmlのキャスト処理に渡され、結果文字化けしたままパースされる(たまにパースできずエラーになる)ことになります
一応 Get-Content -Encoding [文字コード]
で使用する文字コードを指定することはできますが、全部やってくれる関数が用意されているのであればそちらを使うのが無難でしょう