2011年4月21日 星期四

C# XML 應用


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
// 建立一個 XmlDocument 物件並加入 Declaration
XmlDocument xdoc = new XmlDocument();
xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "UTF-8", "yes"));
XmlDocument xdoc1 = new XmlDocument();

// 建立根節點物件並加入 XmlDocument 中 (第 0 層)
XmlElement rootElement = xdoc.CreateElement("Employees");
xdoc.AppendChild(rootElement);

// 建立一個子元素, 並在這個子元素裡加上一個 attribute (第 1 層)
XmlElement eleChild1 = xdoc.CreateElement("Employee");
XmlAttribute attChild1 = xdoc.CreateAttribute("Department");
attChild1.Value = "研發部";
eleChild1.Attributes.Append(attChild1);
rootElement.AppendChild(eleChild1);

// 再為這個子元素加入一個孫元素 (第 2 層)
XmlElement eleGrandChild1 = xdoc.CreateElement("Name");
eleGrandChild1.InnerText = "吳大寶";
eleChild1.AppendChild(eleGrandChild1);

// 建立第二個子元素 (第 1 層)
XmlElement eleChild2 = xdoc.CreateElement("Employee");
XmlAttribute attChild2 = xdoc.CreateAttribute("Department");
attChild2.Value = "總務部";
eleChild2.Attributes.Append(attChild2);

// 建立第二個孫元素 (第 2 層)
XmlElement eleGrandChild2 = xdoc.CreateElement("Name");
eleGrandChild2.InnerText = "鄭小胖";
eleChild2.AppendChild(eleGrandChild2);
rootElement.AppendChild(eleChild2);

// 將建立的 XML 節點儲存為檔案
xdoc.Save(System.AppDomain.CurrentDomain.BaseDirectory +"Test01.xml" );
Console.Write("XML created!");
/*
上面程式的寫法很直接, 你對照產生出來的 XML 內容就自然看得懂程式的邏輯了。
* 唯一值得注意的一點是, 無論是 XmlElement 或 XmlAttribute 物件都一律是 reference type
* , 一旦被建立起來, 那麼不管你把它附加到哪裡幾次
* , 都不會自動建立新的副本 (instance)。
* 例如, 當你建立好上例中第一個子元素後, 雖然你已把它加入根節點
* , 但你不能再把同一個子元素賦予新值或加入不同的孫節點後
* , 再重複加入根節點。就算你這麼做, 根節點中也不會因此產生兩個子節點
* (原因已經說過了 - 程式並不會因為 Append 指令而為你自動產生新的副本)。
* 因此在程式中, 我建立了不同 ID 的子節點、attribute 和孫節點。
*/


/*Linq 方式 創建XML*/
XDocument xdoc12 = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement("Employees", new XElement("Employee", new XAttribute("Department", "研發部"), new XElement("Name", "吳大寶")), new XElement("Employee", new XAttribute("Department", "總務部"), new XElement("Name", "鄭小胖"))));
xdoc.Save(System.AppDomain.CurrentDomain.BaseDirectory + "Test02.xml");
Console.Write("XML created!");

/*讀取XML*/
//XmlDocument xdoc3 = new XmlDocument();
//xdoc.Load(System.AppDomain.CurrentDomain.BaseDirectory+"Test01.xml" );

/*如果 XML 文件的來源不是檔案而是字串, 該怎麼讀入呢? 這時我們可以使用 MemoryStream 物件, 如下例:*/
//Stream s = new MemoryStream(Encoding.UTF8.GetBytes(@" 吳大寶 21 鄭小胖 25 "));
//XmlReader reader = XmlTextReader.Create(s);
//XElement ele = XElement.Load(reader);


/*巡覽XML*/
XmlDocument xdoc4 = new XmlDocument();
xdoc.Load(System.AppDomain.CurrentDomain.BaseDirectory+"Test02.xml");
navigate(xdoc.DocumentElement); // 傳入根節點

Console.ReadKey();


/*相對於 XmlDocument 物件的巡覽方式,
* LINQ 的巡覽方式非常的不一樣。若使用 LINQ, 你根本不必寫什麼遞迴程式 (也很難寫得出來; 我試過了)
* , 重點是根本沒有需要。LINQ 的主要價值,
* 在於它提供了對不同資料來源 (包括 Database、文字資料、XML 與 Object 等等) 的相同的資料篩選方式。
* 對 LINQ to XML 而言, 你不需使用遞迴程式就能簡單的以 XDocument.Descendants
* 或 XElement.Descendants 來把根節點和所有子節點一次通通列出來。
* 以下我們來看看如何列出範例 XML 文件裡面所有的資料:*/

XDocument xdoc5= XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory+"Test02.xml");
var eles = from ele in xdoc5.Descendants()
where ele.Name.LocalName == "Employee"
select new
{
//att = (string)ele.Attribute("Department"),
att = ele.Attribute("Department"),
name = (string)ele.Element("Name")
};
foreach (var ele in eles)
Console.Write("Department = " + ele.att + ", Name = " + ele.name + Environment.NewLine);
Console.ReadKey();

IEnumerable eles1 = xdoc5.Element("Employees").Elements("Employee");
foreach (XElement ele in eles1)
Console.Write(ele.Name + " = " + ele.Value + Environment.NewLine);
Console.ReadKey();
}

static void navigate(XmlNode node)
{
if (node.NodeType == XmlNodeType.Text) // 如果是文字節點則直接印出
Console.WriteLine(node.InnerText + "");
else // 如果是一般節點則另外處理
{
Console.Write("<" + node.Name); if (node.Attributes != null) // 如果是 attribute 則逐個印出 foreach (XmlAttribute attr in node.Attributes) Console.Write(" " + attr.Name + " = \"" + attr.Value + "\""); Console.Write(">");
//核心的部份, 而其中最關鍵的就在以下這段:
foreach (XmlNode child in node.ChildNodes) // 如果還有子節點則繼續處理
navigate(child);
Console.WriteLine("");
}
}
}
}

sql update 學習新寫法

 update a
  set Name='1.PK03P'
  --SELECT *
  from Member a
  where a.NO = 25

 update Member set Name = 'iloveelva' where NO = 25

上述兩句 是相同的東西 用 a 去取代了 Member 這資料表

2011年4月20日 星期三

資料庫正規化

8-2 關聯式資料庫的設計-正規化分析
¨      正規化的三個階段
        第一階正規化(First Normal Form, 1NF
         擁有主鍵且其他所有欄位都功能相依於主鍵。
         沒有重複群組紀錄。
        第二階正規化(Second Normal Form, 2NF):
         符合1NF, 且所有不屬於主鍵的屬性都功能相依於整個主鍵(針對主鍵是組合鍵的例子)。
        第三階正規化(Third Normal Form,3NF
         符合2NF,且所有不屬於主鍵的屬性都不能彼此功能相依。

2011年4月19日 星期二

依賴反轉原則

指導方針

1.變數不可以持有具體類別的引用(如果使用new 就會持有具體類的引用 你可以改用工廠來避開這樣的做法)

2.不要讓類別派生自具體類(如果派生自具體類 你就會依賴具體類 請派生自一個抽象類(接口或抽象類別))

3.不要覆蓋父類別以實現的方法(如果覆蓋父類別以實現的方法 那麼你的父類別就不是一個真正適合被繼承的抽象 父類別以實現的方法 應該與子類別共享)

設計原則: 要依賴抽象 不要依賴具體類

2011年4月18日 星期一

LINQ

介紹網址:http://blog.xuite.net/autosun/study/32615063

2011年4月15日 星期五

設計模式提醒

1.在設計模式中 所謂的 實現一個接口 並"不一定" 表示寫一個類別 並利用implements來實現某一個接口. 實現一個接口 泛指實現某一個superclass 可以是類別或者是介面(interface)的某一個方法

裝飾者模式

動態的將責任附加到對象上 想要擴展功能 裝飾者提供有別於繼承的另一種選擇

設計原則 : 對擴展開放 對修改關閉

例子:java.io and 星巴克咖啡 有許多咖啡 以及裝飾 的調味 如:奶泡 豆漿 牛奶等...

觀察者模式

定義對象之間一對多依賴 , 當一個對象改變狀態時 , 所有的依賴者 都會收到通知並自動更新

相關例子: 報社 與 訂閱者  或者是 按鈕的監聽事件

設計原則: 為了交互對象之間的松耦合設計而努力

設計模式 策略模式

定義算法族  分別封裝起來 讓他們之間可以互相替換  此方法讓算法的變化獨立於使用算法的客戶
 
設計原則 : 找出應用中 可能有變化的地方 把它獨立出來 , 不要和那些不需要變化的東西 放在一起

設計原則 : 針對接口編程 而不針對實現編程

例子 鴨子類別 針對 飛行 和 叫聲 作Interface 的處理


封裝變化

多用組合 少用繼承

針對接口編程 而不針對實現編程