PowerShellでXMLファイルを整形するよ! | XmlTextWriter
こんにちは!ブログを始めて7日目のきっしーです。
一週間たちました。早いものです。
さて、今日は、PowerShellで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></books>
XmlTextWriterでXMLを整形する
XMLはツリー構造です。上の例では、改行やインデントがないので見づらいわけです。これを改行やインデントをいれて見やすくします。
$xmldoc = [xml](Get-Content "c:\temp\books.xml")
$encod = [System.Text.Encoding]::UTF8
$xmlwriter= New-Object System.Xml.XmlTextWriter("c:\temp\books.xml", $encod)
$xmlwriter.Formatting = [System.Xml.Formatting]::Indented
$xmlwriter.IndentChars = "`t"
$xmldoc.Save(xmlwriter)
$xmlwriter.Close()
XmlTextWriterを使って、XMLを整形します。IndentCharsを使ってインデントに使用する文字列を指定しています。上のコードでは、タブを指定しています。
IndentCharsを指定しない場合、つまり、デフォルトでは半角スペース2つ" "になります。
XMLでは、改行やインデントのあると、ないのでは大違い
改行やインデントのあるXMLと、改行やインデントがないXMLとでは、実際には、データとしては別になります。改行の位置を間違えると問題になるケースがあります。
たとえば、以下のような場合です。
<?xml version="1.0" encoding="utf-8"?>
<books>
<book isbn="kissy.blog.jp">
<title>ぶ
ろぐはじめました</title>
<author>kissy</author>
<date>2017-09-02</date>
<price>10000</date>
</book>
</books>
この例では、titleの「ぶ」と「ろぐはじめました」の間に改行が入っています。このtitle属性の値を取得すると「ぶ
ブログなじめました」となります。
終了タグと開始タグの間の改行・空白は問題ない?
前述のように、開始タグと終了タグの間に改行が入っている場合、問題となることはご理解いただけたかと思います。
では、本記事の冒頭のXMLのように、終了タグと開始タグの間に改行や空白が入っているのは、問題ないのでしょうか?
終了タグと開始タグの間に改行や空白が入っているケースでは、属性値としては一緒ですが、プログラム上では注意が必要です。
XMLはツリー構造です。改行や空白もノードなのです。そう、見えないノード。これらはテキストノードと呼ばれます。一方、book要素やtitle要素などは、要素ノードと呼ばれます。
ノードを逐次処理するような場合は、そのノードがどんな種類かを意識しなければなりません。