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 でも出来ると思うんだけど、やり方が分からず断念しました。