都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

LINQ to XML を使って、XML を CSV に変換してみる

 仕事で聞かれたので、とりあえずメモとして残しておきます。下記のような XML を サクッと CSV にしたいといった要件がありました。

<content>
    <item code="item1" name="年齢">
        55
    </item>
    <item code="item2" name="性別">
        男性
    </item>
    <item code="item3" name="都道府県">
        東京都
    </item>
    <item code="item4" name="その他">
        特になし
    </item>
</content>

 上記の XML を下記のような CSV に変換したいという要件です。( 実際の要件はもう少し、複雑で時間がかかるので、簡単な部分だけ切り出しますww ( 全部やるのは面倒なので... ) ) 上記の XML は C:\SampleData.xml に格納するものとします。

item1,年齢,55
item2,性別,男性
item3,都道府県,東京都
item4,その他,特になし

 下記のソースで上記の XML から CSV が出力されます。今回は、C# ではなく VB.NET を使ってみました。( なんとなくです。 ) 『 elem.@code 』、『 elem.@name 』は、item タグの属性にアクセスするための記述で、『 elem.Value 』 は item タグの値にアクセスするための記述です。

Dim contents As IEnumerable(Of String) = _
From elem In XElement.Load("C:\SampleData.xml").<item> Select _
          String.Format("{0},{1},{2}{3}", _
                  elem.@code, _
                  elem.@name, _
                  elem.Value.Trim(), _
                  Environment.NewLine
                  )

Dim sb As StringBuilder = New StringBuilder()
For Each str As String In contents
    sb.Append(str)
Next

Dim sw As New System.IO.StreamWriter("C:\CSVResult1.txt", _
                                     False, _
                                     System.Text.Encoding.GetEncoding("utf-8"))
sw.Write(sb.ToString())
sw.Close()

 最近まったくプログラムやってないですけど、LINQ 便利ですよね。普通に DOM 使って解析するとかもう考えられないです。