public EmergencyDataFormatCollection ImportFromWebSite() { EmergencyDataFormatCollection result = new EmergencyDataFormatCollection(); try { BaseMessage pso2WebSiteData = this.GetPSO2WebSiteData(); if (pso2WebSiteData.Status != ResponceStatus.OK) { result.SetResponceData(pso2WebSiteData); return result; } HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(pso2WebSiteData.GetData.Replace("\r\n", "")); HtmlNodeCollection mainData = htmlDocument.DocumentNode.SelectNodes("//div[@class='tableWrap']"); if (mainData == null || mainData.Nodes().Count() == 0) { result.SetResponceData(null, ResponceStatus.FormatChanged, new Exception(), "FormatChanged"); return result; } foreach (HtmlNode informationNode in mainData) { HtmlNode dayNode = informationNode.PreviousSibling; EmergencyDataFormat emergencyDataFormat = new EmergencyDataFormat(); if (dayNode == null) { continue; } DateTime? day = this.GetDay(dayNode); if (day == null) { //日情報なし continue; } emergencyDataFormat.SetDay(day.Value); this.SetInformation(informationNode, emergencyDataFormat, result); } } catch (Exception ex) { result.SetResponceData(null, ResponceStatus.UnknownError, ex, "Unknown Error"); } return result; }
/// <summary> /// ResultDataに結果を格納する /// </summary> /// <param name="InformationNode"></param> /// <param name="BaseEmergencyData"></param> /// <param name="ResultData"></param> internal BaseMessage SetInformation(HtmlNode InformationNode, EmergencyDataFormat BaseEmergencyData, EmergencyDataFormatCollection ResultData) { BaseMessage result = new BaseMessage(); foreach (HtmlNode current in InformationNode.ChildNodes) { for (HtmlNode htmlNode = current.FirstChild; htmlNode != null; htmlNode = htmlNode.NextSibling) { //ヘッダーは無視 if (htmlNode == current.FirstChild) { continue; } EmergencyDataFormat emergencyData = (EmergencyDataFormat)BaseEmergencyData.Clone(); for (int columnCount = 0; columnCount < 3; columnCount++) { if (htmlNode.ChildNodes.Count != 3) { //unknown format result.SetResponceData(null, ResponceStatus.FormatChanged, new Exception(), "SetInfomation:TableNode Not 3"); continue; } switch (columnCount) { case 0: //時間 string eventTimeText = htmlNode.ChildNodes[columnCount].InnerText; KeyValuePair<TimeSpan, TimeSpan> time = this.GetTime(eventTimeText); emergencyData.StartTime = emergencyData.StartTime.Add(time.Key); emergencyData.EndTime = emergencyData.EndTime.Add(time.Value); break; case 1: //種類 string eventTypeText = htmlNode.ChildNodes[columnCount].FirstChild.Attributes["alt"].Value; emergencyData.EventType = this.GetEventType(eventTypeText); break; case 2: //イベント内容 string eventInfoText = htmlNode.ChildNodes[columnCount].InnerText; emergencyData.EventInformation = eventInfoText; break; } } ResultData.Add(emergencyData); } } return result; }