8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Powershell】 そのXMLの読み込み方は間違えている

Posted at

そのXMLの読み込み方は間違えている

はじめに

短いです
間違った(できるけど適切ではない?)情報がインターネット上に広まっていたので、自分用のメモも兼ねて書いてます
間違った箇所があればコメントお願いします :bow:

間違った(適切でない)方法

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 [文字コード] で使用する文字コードを指定することはできますが、全部やってくれる関数が用意されているのであればそちらを使うのが無難でしょう

参考

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?