open data intro

92
Open Data Intro Using C# and XML

Upload: lorex-l-yang

Post on 06-Aug-2015

104 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Open Data Intro

Open Data IntroUsing C# and XML

Page 2: Open Data Intro

About me

• Lorex L. Yang

• 你可以叫我 L ,但請切記我不認識夜神月,也看不懂死亡筆記本。• [email protected]

• https://github.com/Lorex (一堆無意義的 Repo…… )

• Sinta Design 學生資訊社群 / 副社長• 立志中學電腦與資訊研究社 / 講師• 高雄市議員 / 資訊顧問• 正太控一枚

Page 3: Open Data Intro

其實我只是個高中生

Page 4: Open Data Intro

只不過高中讀了五年

Page 5: Open Data Intro

在苦讀五年之後

Page 6: Open Data Intro

我休學了 XDDD

Page 7: Open Data Intro

Open Data歐噴.爹塔

Page 8: Open Data Intro

WTF is Open Data ?

Page 9: Open Data Intro

!!

Page 10: Open Data Intro

Before we get started…

Page 11: Open Data Intro

先來句經典格言

Page 12: Open Data Intro

“ 我好帥 ”

- Lorex L. Yang, SintaDesign 學生資訊社群 副團長

Page 13: Open Data Intro

“ Information is the currency of democracy. ”

- Thomas Jefferson, the 3rd President of the U.S.

Page 14: Open Data Intro

So.

Page 15: Open Data Intro

WTF is Open Data ?

Page 16: Open Data Intro

Freely to use.

Page 17: Open Data Intro

Freely to republic republish.

開什麼玩笑! 要不要 Republic 要交給 13 億人民來決定才對!!

Page 18: Open Data Intro

Without restrictions from copyright.

Page 19: Open Data Intro

Available to everyone.

Page 20: Open Data Intro

Why Open Data ?

Page 21: Open Data Intro

Transparency

Page 22: Open Data Intro

Democratic control

Page 23: Open Data Intro

Participation

Page 24: Open Data Intro

Innovation

Page 25: Open Data Intro

Government x Open Data

Page 26: Open Data Intro

Why government ?

Page 27: Open Data Intro

我們都知道……

Page 28: Open Data Intro

政府真的很清廉……

Page 29: Open Data Intro

於是我們要求政府建 Open Data

Page 30: Open Data Intro

Another reason

Page 31: Open Data Intro

我們都知道……

Page 32: Open Data Intro

以下為 參考 裝飾用。

Page 33: Open Data Intro

想打 1999……

Page 34: Open Data Intro

「請問誤點的是哪個班次呢?」「請問誤點的駕駛是哪位呢?」

「請問誤點的車牌號碼是甚麼呢?」

Page 35: Open Data Intro
Page 36: Open Data Intro

如果政府有 Open Data……

Page 37: Open Data Intro

交通局 你

Page 38: Open Data Intro

有數據可以婊,爽!

Page 39: Open Data Intro

Example

Page 40: Open Data Intro

交通局-捷運動態資訊系統

Page 41: Open Data Intro

氣象局-水庫洩洪警戒

Page 42: Open Data Intro

內政部-政治獻金紀錄…… . 恩,不意外。

Page 43: Open Data Intro

How to use ?

Page 44: Open Data Intro

等等!

Page 45: Open Data Intro
Page 46: Open Data Intro

地下管線資料不開放

Page 47: Open Data Intro

知道 Open Data 的重要性了吧

Page 48: Open Data Intro

How to use ?

Page 49: Open Data Intro

以高雄市公車動態資訊系統為例

Page 50: Open Data Intro

先來看一下政府做的介面……http://122.146.229.210/bus/Dybus.aspx#

Page 51: Open Data Intro
Page 52: Open Data Intro

什麼?找不到到站歷史紀錄?

Page 53: Open Data Intro

政府:

呵呵,自幹吧你 (́C◕ლ ◞ ◟◕‵౪ )ლGovernment says go f*** yourself

Page 54: Open Data Intro

C# + XML

Page 55: Open Data Intro

What is XML ?

Page 56: Open Data Intro

eXtensible Markup Language

Page 57: Open Data Intro

Example

<?xml version=“1.0?>

< 腫花皿鍋 >

< 政治人物 >

< 馬芙丸 seat=“ 區長” class=“ 水母” alias=“bumbler” />

< 祭止兀 seat=“ 立猥” class=“ 盜圖” alias=“” />

< 靈異室 seat=“ 秘書長” class=“3323” alias=“014” />

</ 政治人物 >

< 腫花皿鍋 >

Page 58: Open Data Intro

開始自幹Go F*** Yourself.

Page 59: Open Data Intro

Repohttps://github.com/Lorex/KH-Bus-Agent

Page 60: Open Data Intro

Open Data used

• 公車路線表• http://122.146.229.210/xmlbus2/StaticData/GetRoute.xml

• 公車到站時間• http://122.146.229.210/xmlbus2/GetEstimateTime.xml?routeIds={ 路

線 }

Page 61: Open Data Intro

XML 欄位介紹

Page 62: Open Data Intro

Concept. 自己寫兩個 Function

• 讀取並更新所有公車的路線• private void RefRoute()

• 讀取並更新到站資訊• private void RefEstimate(string Route,bool History,bool AutoRef10s)

• Route • 要查詢的路線

• History : • True :正在更新的是所有路線在這時間的到站資訊• False :正在更新的是單一路線的所有站點資訊

• AutoRef10s :• True :正在更新的是每 10 秒自動觸發的更新事件

Page 63: Open Data Intro

首先宣告XmlDocument doc = new XmlDocument();

Page 64: Open Data Intro

Part 1. 讀取公車路線private void RefRoute()

{    //ComboBox 清空列表 comboBox1.Items.Clear();

    //載入 XML 文件 doc.Load("http://122.146.229.210/xmlbus2/StaticData/GetRoute.xml");

    //選擇節點列表 XmlNodeList NodeLists = doc.SelectNodes("BusDynInfo/BusInfo/Route");

    // 讀取節點 foreach (XmlNode Single in NodeLists) {        // 寫入到 ComboBox 選單裡面 comboBox1.Items.Add(Single.Attributes["ID"].Value);    }}

Page 65: Open Data Intro

Part 2-1. 顯示選擇路線的詳細資訊 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{    //載入 doc.Load("http://122.146.229.210/xmlbus2/StaticData/GetRoute.xml");

    // 讀取節點清單 XmlNodeList NodeLists = doc.SelectNodes("BusDynInfo/BusInfo/Route");

    // 讀取節點 foreach (XmlNode Single in NodeLists) {        if (Single.Attributes["ID"].Value == comboBox1.Text)

{            // 開始拉節點屬性 label5.Text = Single.Attributes["ddesc"].Value;            label6.Text = Single.Attributes["departureZh"].Value;            label7.Text = Single.Attributes["destinationZh"].Value;        }    }

    // 讀取到站時間 RefEstimate(comboBox1.Text,false,false);}

Page 66: Open Data Intro

Part 2-2. 讓他自動更新private void timer1_Tick(object sender, EventArgs e)

{    RefEstimate(comboBox1.Text,false,true);}

private void timer2_Tick(object sender, EventArgs e)

{    timer1.Enabled = false;    foreach(string line in comboBox1.Items)

{        RefEstimate(line,true,false);    }    timer1.Enabled = true;}

Page 67: Open Data Intro

在開始顯示到站資訊之前…

Page 68: Open Data Intro

DataGridView 控制項

Page 69: Open Data Intro

可以看成是一張表格Column = 欄 = 直排

Row = 列 = 橫排

Page 70: Open Data Intro

編輯欄位

Page 71: Open Data Intro

Part 3. 開始實作到站資訊更新 - Review

private void RefEstimate(string Route,bool History,bool AutoRef10s) {}

• Route • 要查詢的路線

• History : • True :正在更新的是所有路線在這時間的到站資訊• False :正在更新的是單一路線的所有站點資訊

• AutoRef10s :• True :正在更新的是每 10 秒自動觸發的更新事件

Page 72: Open Data Intro

Part 3-1. 判斷輸入if (Route == "")    return;

string link = "http://122.146.229.210/xmlbus2/GetEstimateTime.xml?routeIds=" + Route;

Page 73: Open Data Intro

Part 3-2. XML處理// 讀取 XMLdoc.Load(link);

// 讀取節點列表XmlNodeList NodeLists = doc.SelectNodes("BusDynInfo/BusInfo/Route/EstimateTime");

if (History == false)    dataGridView1.Rows.Clear();

// 讀取各節點foreach(XmlNode Single in NodeLists)

{…}

Page 74: Open Data Intro

Part 3-3. 拆 XML

foreach(XmlNode Single in NodeLists)

{    string GoBack = (Single.Attributes["GoBack"].Value == "1") ? "去程 " : "返程 ";    string StopName = Single.Attributes["StopName"].Value;    string Value = Single.Attributes["Value"].Value;    string CarID = (Single.Attributes["carId"].Value == "") ? "未發車 " : Single.Attributes["carId"].Value;

    DateTime dt = DateTime.Now;    dt = dt.AddMinutes((Single.Attributes["Value"].Value == "null") ? 0 : Convert.ToDouble(Single.Attributes["Value"].Value));

    string ArriveTime = (Single.Attributes["Value"].Value == "null") ? "未發車 " : dt.ToString("HH : mm");

    ...

Page 75: Open Data Intro

Part 3-4. 時間處理switch (Value)

{case "null":    Value = "未發車 ";    break;

case "0":    Value = "進站中 ";    if (!AutoRef10s)        dataGridView2.Rows.Add(Route,GoBack, StopName, ArriveTime, CarID);    break;

default :    Value = Value + " 分鐘 ";    break;

}

Page 76: Open Data Intro

Part 3-5. 寫入 DataGridView

if (History == false)    dataGridView1.Rows.Add(GoBack,StopName,Value,ArriveTime,CarID);

Page 77: Open Data Intro

休息一下Q&A Time

Page 78: Open Data Intro

實作歷史紀錄一天一個檔案

Page 79: Open Data Intro

Concept. 這邊要自己寫一個 Function

•把歷史資料寫入 XML 檔• private void XMLWrite()

Page 80: Open Data Intro

Part 4-1. 當歷史資料表更新的時候…private void XMLWrite()private void dataGridView2_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)

{    //顯示到最後一列 dataGridView2.FirstDisplayedScrollingRowIndex = dataGridView2.Rows.Count - 1;

// 寫入 XML    XMLWrite();}

Page 81: Open Data Intro

Part 4-2. 讓使用者選擇存檔資料夾 private void button1_Click(object sender, EventArgs e)

{    folderBrowserDialog1.ShowDialog();    if (folderBrowserDialog1.SelectedPath == "")        folderBrowserDialog1.SelectedPath = @"D:\Logs";    textBox1.Text = folderBrowserDialog1.SelectedPath;}

Page 82: Open Data Intro

Part 4-3-1. 實作寫入到 XML

private void XMLWrite()

{    XmlDocument doc = new XmlDocument();

    //檢驗檔案是否存在 string path = textBox1.Text;    if (path == "")        path = @"D:\Logs";

    string filename = DateTime.Now.ToString("yyyy-MM-dd") + ".xml";

Page 83: Open Data Intro

Part 4-3-2. 建立 XML

// 如果檔案不存在if (!System.IO.File.Exists(System.IO.Path.Combine(path, filename)))

{    // 建立根節點 XmlElement root = doc.CreateElement(“CarHistory”);    doc.AppendChild(root);

    // 建立子節點 XmlElement sec = doc.CreateElement(“List”);    sec.SetAttribute(“Date”,DateTime.Now.ToString(“yyyyy-MM-dd”));    root.AppendChild(sec);

    // 建立資料夾(如果不存在的話) if (!System.IO.Directory.Exists(path))        System.IO.Directory.CreateDirectory(path);

    System.IO.File.Create(filename);    doc.Save(System.IO.Path.Combine(path, filename));}

Page 84: Open Data Intro

Part 4-3-3. 載入 XML

//載入 XMLdoc.Load(System.IO.Path.Combine(path, filename));XmlNode node = doc.SelectSingleNode("CarHistory/List");

if (node == null)    return;

Page 85: Open Data Intro

Part 4-3-4. 將歷史資料寫入節點// 開始建立節點XmlElement main = doc.CreateElement("History");

main.SetAttribute("Line", dataGridView2[0, dataGridView2.Rows.Count - 1].Value.ToString());

main.SetAttribute("GoBack", dataGridView2[1, dataGridView2.Rows.Count - 1].Value.ToString());

main.SetAttribute("StopName", dataGridView2[2, dataGridView2.Rows.Count - 1].Value.ToString());

main.SetAttribute("Time", dataGridView2[3, dataGridView2.Rows.Count - 1].Value.ToString());

main.SetAttribute("CarID", dataGridView2[4, dataGridView2.Rows.Count - 1].Value.ToString());

node.AppendChild(main);doc.Save(System.IO.Path.Combine(path, filename));

Page 86: Open Data Intro

Compile & Run

Page 87: Open Data Intro

自幹成功Successfully f***ed myself !

Page 88: Open Data Intro

工商服務時間

Page 89: Open Data Intro

中和高中 Hacking & Gaming

https://www.facebook.com/CHHG1st

Page 90: Open Data Intro

SintaDesign 學生資訊社群

https://www.facebook.com/groups/sintadesign/

Page 91: Open Data Intro

正太 50 無限收,意者密By 不猥瑣的正太控 Lorex

Page 92: Open Data Intro

Q&A