F#: XMLの出力 (一部修正)

a0002_009631

昨日の記事のコードだと、妙なエンコーディングになっていました。

  • 出力されるファイルのエンコーディングはShiftJIS
  • でもXML宣言部に書かれているのはUTF-16

UTF-8に揃えるために、以下のように修正。

  • コンソールの出力エンコーディングをUTF-8に変更
  • XmlWriter.WriteStartDocumentでXML宣言部出力していたのを、XmlWriter.WriteProcessingInstructionで出力するように変更。

修正したコードは以下のとおり。

module SharedHorseInfoPrinter.Main

open System.Xml;

open SharedHorseInfoPrinter.HorseRaceInfo;
open SharedHorseInfoPrinter.HorseInfo;
open SharedHorseInfoPrinter.HorseInfoCreator;

let getHorseInfoArray conn kettoTorokuBango =
    let creator = HorseInfoCreator conn
    Seq.map creator.createHorseInfo kettoTorokuBango

let getDateString (x : System.DateTime) = x.ToString(@"yyyy-MM-dd")

let getHorseInfoXml horseInfoArray =
    use strWriter = new System.IO.StringWriter()
    use writer = new XmlTextWriter(strWriter)
    writer.Formatting <- Formatting.Indented
    writer.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
    writer.WriteStartElement(@"HorseList")
    Seq.iter (fun (x : HorseInfo option) ->
        match x with
        | Some y ->
            writer.WriteStartElement(@"Horse")
            writer.WriteAttributeString(@"KettoTorokuBango", y.KettoTorokuBango)
            writer.WriteAttributeString(@"Bamei", y.Bamei)
            writer.WriteAttributeString(@"Seibetsu", y.Seibetsu)
            writer.WriteAttributeString(@"Moshoku", y.Moshoku)
            writer.WriteAttributeString(@"Seinengappi", getDateString y.Seinengappi)
            writer.WriteAttributeString(@"Shozoku", y.Shozoku)
            writer.WriteAttributeString(@"Chokyoshi", y.Chokyoshi)
            writer.WriteAttributeString(@"Sire", y.Sire)
            writer.WriteAttributeString(@"Broodmare", y.Broodmare)
            writer.WriteAttributeString(@"BMS", y.BMS)
            writer.WriteStartElement(@"Races")
            Seq.iter (fun (z : HorseRaceInfo) ->
                writer.WriteStartElement(@"Race")
                writer.WriteAttributeString(@"Kaisainengappi", getDateString z.Kaisainengappi)
                writer.WriteAttributeString(@"Keibajo", z.Keibajo)
                writer.WriteAttributeString(@"Name", z.Name)
                writer.WriteAttributeString(@"Joken", z.Joken)
                writer.WriteAttributeString(@"Grade", z.Grade)
                writer.WriteAttributeString(@"Track", z.Track)
                writer.WriteAttributeString(@"Kyori", z.Kyori.ToString())
                writer.WriteAttributeString(@"Kishumei", z.Kishumei)
                writer.WriteAttributeString(@"Futan", z.Futan.ToString())
                writer.WriteAttributeString(@"Chakujun", z.Chakujun.ToString())
                writer.WriteAttributeString(@"Ninki", z.Ninki.ToString())
                writer.WriteAttributeString(@"Tosu", z.Tosu.ToString())
                writer.WriteAttributeString(@"Odds", z.Odds.ToString())
                writer.WriteAttributeString(@"Time", z.Time.ToString())
                writer.WriteAttributeString(@"Agari3F", z.Agari3F.ToString())
                writer.WriteAttributeString(@"Shiba", z.Shiba)
                writer.WriteAttributeString(@"Dirt", z.Dirt)
                writer.WriteAttributeString(@"Aite", z.Aite)
                writer.WriteAttributeString(@"Timesa", z.Timesa.ToString())
                writer.WriteEndElement()
                ) y.Race
            writer.WriteEndElement()
            writer.WriteEndElement()
        | None -> ()
    ) horseInfoArray
    writer.WriteEndElement();
    strWriter.ToString()

[<EntryPoint>]
let main argv =
    use conn = new MySql.Data.MySqlClient.MySqlConnection
                    @"userid=XXX;password=XXX;database=XXX;Host=XXX"
    conn.Open()
    System.Console.OutputEncoding <- new System.Text.UTF8Encoding();
    getHorseInfoArray conn argv |> getHorseInfoXml |> printfn "%s"

    0 // 整数の終了コードを返します
スポンサーリンク

フォローする

スポンサーリンク