XML ファイルを書きかえるのに、PowerShell が便利!

Groovy (Java)を分かってないだけかもしれませんが、PowerShell の方が便利でした。


こんな データベースの定義を表す xml があった時に、

<Database>
  <Table name="M001_User" >
    <Column name="Id" Type="int" Length="0"/>
    <Column name="Name" Type="nvarchar" Length="50"/>
    <Column name="Age" Type="int" Length="0"/>
  </Table>
  <Table name="M002_Org" >
    <Column name="Id" Type="int" Length="0"/>
    <Column name="Name" Type="nchar" Length="30"/>
  </Table>
</Database>

Id って名前の列の型を long に、Name って名前の列の型を nvarchar で Length を 50 に変更したい。こんな感じ。

<Database>
  <Table name="M001_User">
    <Column name="Id" Type="long" Length="0" />
    <Column name="Name" Type="nvarchar" Length="50" />
    <Column name="Age" Type="int" Length="0" />
  </Table>
  <Table name="M002_Org">
    <Column name="Id" Type="long" Length="0" />
    <Column name="Name" Type="nvarchar" Length="50" />
  </Table>
</Database>


Groovy では、読み込んで列挙するのは出来たんだけど、変更して保存するのが分からず挫折。
結局、PowerShell でやりました。これが結構便利だな〜と思ったので今回紹介してみました。

Groovy のコード。コメント化している所は、こんな感じに書きたかったってとこ。

def database = new XmlParser().parse(/C:\test.xml/)
database.Table.each{
  it.Column.each {
    if (it.attribute("name") == "Id") {
      // it.setAttribute("Type", "long")
    } else if (it.attribute("name") == "Name") {
      // it.setAttribute("Type", "nvarchar")
      // it.setAttribute("Length", 50)
    } 
  }
}
// database.save(/C:\test2.xml/)

PowerShell のコード

[xml]$xml = Get-Content "c:\test.xml" -Encoding UTF8
$database = $xml.Database
foreach ($table in $database.Table) { 
  foreach ($column in $table.Column) {
    if ($column.name -eq "Id") {
      $column.Type = "long"
    } elseif($column.name -eq "Name") {
      $column.Type = "nvarchar"
      $column.Length = "50"
    }
  } 
}
$xml.Save("c:\work\test.xml")

PowerShell も"."(ドット) で子要素や属性にアクセス出来るので、凄い書きやすかったです。
XML の操作は PowerShell もありかな?と思いました。


※Groovy でも出来ると思うんだけど、やり方が分からず断念しました。