【2023年】これからブログを始める人へおすすめの書籍

Kissy

PowerShellでXMLファイルを整形するよ! | XmlTextWriter

作成: 更新:

XML Document

こんにちは!ブログを始めて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要素などは、要素ノードと呼ばれます。

ノードを逐次処理するような場合は、そのノードがどんな種類かを意識しなければなりません。

関連記事

SPONSORED LINK
SPONSORED LINK