お馬の写真 別館

「お馬の写真」管理者による徒然なるブログ

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 // 整数の終了コードを返します

 - プログラミング