無處不在的XML
在學習XML之前我們先想一下,在之前我們見過這個東西么?
主要作用是做數據的存儲,而HTML是做數據的展現.
當我們用數據庫存儲的時候的優點是,安全度高,查詢方便.缺點就是數據量小的時候,用數據庫有點殺雞用牛刀的感覺.而且數據庫這種存儲方式必須依賴某個軟件才能查看.
用文本文件的優點是,快速,方便.缺點就是:不安全.設計格式不太方便.
XML是個文本文件,任何操作系統都能識別,能把我們要的數據結構化的存儲起來.
Office2007的文件格式docx、xlsx、pptx都是xml,先改成rar文件然后解壓。
XML和HTML的區別:
- XML有且只能有一個根元素
- XML嚴格區分大小寫—如果是大寫就全是大寫,如果是小寫就全是小寫
- XML中的屬性都必須用引號引起來(推薦:雙引號)
- 元素有開始,必須有結束.
一、XML和HTML的區別演示代碼
HTML有一些預定義的標簽,而XML則沒有。HTML標簽不能擴展,XML可以擴展。除了頭上面這個是預定義好的:<?xml version=”1.0” encoding=”gb2312”?>
在XML里面有一個規范xsd,在這里我們不學怎么寫規范,只是學習一下怎么去用XML就可以了。
二、應用程序配置文件
這個配置文件就是個XML文件,經常用的就是數據庫連接。
三、XML文檔規范
XML當中的嵌套問題:
四、XML當中的嵌套
用記事本就可以編寫XML文件,通過程序來寫怎么來寫呢?
1.Dom[XmlDocument、XDocument](文檔對象模型,將整個xml加載到內存中,然后操作)、
2.Sax(事件驅動,.net中使用XmlReader(XmlTextReader)、XmlWriter(XmlTextWriter)來替代)等,還有高級的讀寫技術
3.XmlSerializer(xml序列化,需要先定義類)、
4.Linq To XML(System.Xml.Linq)等, XmlSerializer要求對每種不同的文件都定義一套類,很麻煩,而Linq To XML則不需要單獨創建類,當然更底層一些,代碼比XmlSerializer多,靈活性更高。System.Xml下的類是2.0及之前操作xml推薦的,現在很多人也仍然在用這個namespace下的類,這個namespace下的類和Linq To XML非常相似,因此不用單獨學。
下面我們手動寫一個XML.我就用記事本寫了.
存儲單位的所有的員工:
五、新建xml文件
插入手寫的XML文件,存儲員工信息。

1 <?xml version="1.0" encoding="gb2312"?> 2 <guoxing> 3 <technicalsection count="50" room="1403"> 4 <employee TNo="gx001"> 5 <name>陳濤</name> 6 <age>18</age> 7 <gender>男</gender> 8 </employee> 9 <employee TNo="gx001"> 10 <name>陳濤2</name> 11 <age>18</age> 12 <gender>男</gender> 13 </employee> 14 <employee TNo="gx001"> 15 <name>陳濤3</name> 16 <age>18</age> 17 <gender>男</gender> 18 </employee> 19 <employee TNo="gx001"> 20 <name>陳濤4</name> 21 <age>18</age> 22 <gender>男</gender> 23 </employee> 24 <employee TNo="gx001"> 25 <name>陳濤5</name> 26 <age>18</age> 27 <gender>男</gender> 28 </employee> 29 </technicalsection> 30 31 <salesdepartment count="50" room="1506"> 32 33 </salesdepartment> 34 </guoxing>
可以用瀏覽器進行預覽。
六、在瀏覽器中進行預覽的效果
接下來我們就介紹通過程序來寫一個XML文件。和通過程序來讀XML文件。
下把我們剛自己手動寫好的XML文件拷入程序,然后,讀取下。
七、添加XML文件
八、遞歸輸出每個節點
在還有子元素的情況下,我們這里已經沒辦法再遍歷出來了。所以在這里我們就考慮遞歸了。
九、遞歸顯示每個子元素代碼
接下來我們在讀取其中的屬性
十、輸出屬性的代碼
現在我只想輸出count屬性,怎么辦呢?
item.Attribute(“count”);//根據屬性名來獲取指定的屬性的值。
在name標簽里面還有值,怎么才能打印出來里面的值呢?當沒有子元素的時候就把值打印出來。
判斷一下當前標簽是否有子元素。
十一、把沒有子元素的值也打印出來
上面我們是把XML顯示在控制台上了,要是加載到treeview就比較的清晰了。(作業)
XML當中的其它一些個基本概念。
在XML當中可以寫個注釋
注釋不能算是XML的元素,但是這些都是XML的節點。所以注釋打印不出來。
xdoc.Elements()//只返回元素
xdoc.Nodes()返回所有節點(包括注釋等。)
xeRoot.Elements(“net”)搜索直接子元素
xeRoot.Descendants(“net”);搜索所有后代元素。
將XML文件遞歸加載到treeview上。
十二、畫好界面,加載好文件
十三、遞歸到樹
網頁RSS訂閱
打開網站看新聞的時候,會有很多的廣告。在網站上找到RSS。
十四、點擊:XML訂閱
對於各大網站,如果我們只看新聞的標題,不看內容的話,對於我們看新聞來講會更加的直接。
打開foxmail
十五、RSS訂閱
formail是怎么得到網頁當天的新聞的呢?是連上網頁的數據庫了么?這是不可能的。我們把剛才的網頁xml文件下載-另存為一下。
十六、下載xml文件
十七、用高級記事本打開看下里面的內容
想讓它正常格式顯示的話,復制-粘貼到xml文件
十八、新建xml文件
在我們的編輯工具里面,ctrl+K+D,自動格式化了。去掉外部樣式表,就跟我們自己寫的xml一回事兒了。
十九、普通的xml文件
xml文件當中只有一個根節點,包含了什么內容呢?包含channel這個節點。formail通過title識別哪個頻道,我們的formail之所以能看到新聞,就是它讀取並且解析了這個xml文件。
把這個xml文件放到我們寫的項目下,
二十、也能實現加載內容
xml案例
讀取order.xml文件,一行一行的輸出。
二十一、將xml文件拷貝過來
二十二、需要我們讀取並且輸出的xml文件
二十三、讀取訂單xml文件內容並輸出的代碼
我們在看下面一個案例:
二十四、銀行交易數據讀寫
案例中需要用到的XML文件插入位置:

1 <?xml version="1.0" encoding="utf-8" ?> 2 <CFX> 3 <MSG> 4 <交易碼 val="1000"/> 5 <流水號 val="100000000000000001"/> 6 <金額 val="1234567890.12"/> 7 <付款機構 val="騰訊銷售部"/> 8 <付款單位賬號 val="12345678901234567890"/> 9 <收款機構 val="新浪財務部"/> 10 <收款單位賬號 val="12345678901234567890"/> 11 </MSG> 12 <MSG> 13 <交易碼 val="1000"/> 14 <流水號 val="100000000000000002"/> 15 <金額 val="1234567890.12"/> 16 <付款機構 val="1234"/> 17 <付款單位賬號 val="12345678901234567890"/> 18 <收款機構 val="1234"/> 19 <收款單位賬號 val="12345678901234567890"/> 20 </MSG> 21 <MSG> 22 <交易碼 val="1000"/> 23 <流水號 val="100000000000000003"/> 24 <金額 val="1234567890.12"/> 25 <付款機構 val="1234"/> 26 <付款單位賬號 val="12345678901234567890"/> 27 <收款機構 val="1234"/> 28 <收款單位賬號 val="12345678901234567890"/> 29 </MSG> 30 <MSG> 31 <交易碼 val="1000"/> 32 <流水號 val="100000000000000004"/> 33 <金額 val="1234567890.12"/> 34 <付款機構 val="1234"/> 35 <付款單位賬號 val="12345678901234567890"/> 36 <收款機構 val="1234"/> 37 <收款單位賬號 val="12345678901234567890"/> 38 </MSG> 39 <MSG> 40 <交易碼 val="1000"/> 41 <流水號 val="100000000000000005"/> 42 <金額 val="1234567890.12"/> 43 <付款機構 val="1234"/> 44 <付款單位賬號 val="12345678901234567890"/> 45 <收款機構 val="1234"/> 46 <收款單位賬號 val="12345678901234567890"/> 47 </MSG> 48 <MSG> 49 <交易碼 val="1000"/> 50 <流水號 val="100000000000000006"/> 51 <金額 val="1234567890.12"/> 52 <付款機構 val="1234"/> 53 <付款單位賬號 val="12345678901234567890"/> 54 <收款機構 val="1234"/> 55 <收款單位賬號 val="12345678901234567890"/> 56 </MSG> 57 <MSG> 58 <交易碼 val="1000"/> 59 <流水號 val="100000000000000007"/> 60 <金額 val="1234567890.12"/> 61 <付款機構 val="1234"/> 62 <付款單位賬號 val="12345678901234567890"/> 63 <收款機構 val="1234"/> 64 <收款單位賬號 val="12345678901234567890"/> 65 </MSG> 66 <MSG> 67 <交易碼 val="1000"/> 68 <流水號 val="100000000000000008"/> 69 <金額 val="1234567890.12"/> 70 <付款機構 val="1234"/> 71 <付款單位賬號 val="12345678901234567890"/> 72 <收款機構 val="1234"/> 73 <收款單位賬號 val="12345678901234567890"/> 74 </MSG> 75 <MSG> 76 <交易碼 val="1000"/> 77 <流水號 val="100000000000000009"/> 78 <金額 val="1234567890.12"/> 79 <付款機構 val="1234"/> 80 <付款單位賬號 val="12345678901234567890"/> 81 <收款機構 val="1234"/> 82 <收款單位賬號 val="12345678901234567890"/> 83 </MSG> 84 <MSG> 85 <交易碼 val="1000"/> 86 <流水號 val="100000000000000010"/> 87 <金額 val="1234567890.12"/> 88 <付款機構 val="1234"/> 89 <付款單位賬號 val="12345678901234567890"/> 90 <收款機構 val="1234"/> 91 <收款單位賬號 val="12345678901234567890"/> 92 </MSG> 93 <MSG> 94 <交易碼 val="1000"/> 95 <流水號 val="100000000000000011"/> 96 <金額 val="1234567890.12"/> 97 <付款機構 val="1234"/> 98 <付款單位賬號 val="12345678901234567890"/> 99 <收款機構 val="1234"/> 100 <收款單位賬號 val="12345678901234567890"/> 101 </MSG> 102 <MSG> 103 <交易碼 val="1000"/> 104 <流水號 val="100000000000000012"/> 105 <金額 val="1234567890.12"/> 106 <付款機構 val="1234"/> 107 <付款單位賬號 val="12345678901234567890"/> 108 <收款機構 val="1234"/> 109 <收款單位賬號 val="12345678901234567890"/> 110 </MSG> 111 <MSG> 112 <交易碼 val="1000"/> 113 <流水號 val="100000000000000013"/> 114 <金額 val="1234567890.12"/> 115 <付款機構 val="1234"/> 116 <付款單位賬號 val="12345678901234567890"/> 117 <收款機構 val="1234"/> 118 <收款單位賬號 val="12345678901234567890"/> 119 </MSG> 120 <MSG> 121 <交易碼 val="1000"/> 122 <流水號 val="100000000000000014"/> 123 <金額 val="1234567890.12"/> 124 <付款機構 val="1234"/> 125 <付款單位賬號 val="12345678901234567890"/> 126 <收款機構 val="1234"/> 127 <收款單位賬號 val="12345678901234567890"/> 128 </MSG> 129 <MSG> 130 <交易碼 val="1000"/> 131 <流水號 val="100000000000000015"/> 132 <金額 val="1234567890.12"/> 133 <付款機構 val="1234"/> 134 <付款單位賬號 val="12345678901234567890"/> 135 <收款機構 val="1234"/> 136 <收款單位賬號 val="12345678901234567890"/> 137 </MSG> 138 </CFX>
在做之前我們先分析一下這個XML文件,有一個根節點CFX,有多條MSG。每個MSG里面包括交易碼,流水號,金額。
二十五、還是先把XML文件拷貝過來
二十六、讀取交易記錄的xml的代碼
現在我們觀察這么一段XML文件。
二十七、需要觀察的xml代碼
文件中有四位同學,現在請獲取一年級同學的信息。
現在我們有種相對簡單的辦法。
二十八、引入xml文件
二十九、XmlDocument所在的命名空間
三十、xpath應用演示
大家在MSDN里面輸入xpath就能找到xpath每個表達式每個意思。
下面是我搜集的xpath表達式的連接,大家可以點擊查看。
下面我們先說一個問題,就是XML的序列化問題:
三十一、xml序列化需要用到的類
三十二、序列化person對象
三十三、序列化成功
三十四、序列化list集合,注意變化的地方
三十五、list序列化成功
這樣我們通過xml序列化可以非常方便的把一個對象直接寫成個xml文件。
反序列化變成了xmlSer.Deserialize();
現在講講剛才我們提出的問題,為什么需要傳遞typeof(List<Person>)。我們拿到對象的類型能干什么呢?
如果一時想不出來,看下下面的案例:
三十六、例題
像上面這樣寫,能寫進去,但是有個問題,如果我再寫幾個對象進去,屬性這塊能不能動態的獲取呢?參考下系統給我們提供的方法,反射,通過類型獲取成員。xml序列化就是通過反射來完成的。
自己思考下怎么自己寫xml序列化:(小提示)
三十七、小提示
在xml序列化里面還有一個特性:
三十八、[XmlIgnreAttribute]特性
接下來我們看下關於深拷貝、淺拷貝的問題:
這個問題在面試的時候也是時有出現的。我們大家得知道什么是深拷貝、淺拷貝,以及讓我們去做的話怎么去實現。
我寫一段代碼,大家觀察。
三十九、從案例中明白什么是深拷貝,什么是淺拷貝
下面看如何實現深拷貝、淺拷貝。
四十、淺拷貝是它父類的方法
測驗一下:
四十一、p1和p2棧地址堆地址不一樣
四十二、表示淺拷貝對於引用類型確實指向同一塊內存
四十三、實現淺拷貝的代碼
四十四、深拷貝的測驗
四十五、深拷貝代碼
四十六、淺拷貝,深拷貝圖解
作者近期文章列表:
C#中級進階教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#中級進階教程,無任何商業目的。 希望與更多的代碼愛好者交流心得,也請高手多多指點!!!) |
|
三層及其它內容 | 遞歸 |
三層(一) | |
三層相關案例(及常見的錯誤) | |
三層實例(內涵Sql CRUD) | |
手寫代碼生成器 | |
SQL數據庫 ADO.net | 數據庫的應用圖解一 |
數據庫的應用詳解二 | |
ADO.NET(內涵效率問題) | |
ADO.NET實例教學一 | |
ADO.NET(內含存儲過程講解) | |
面向過程,面向對象中高級 | 面向過程,面向對象的深入理解一 |
面向過程,面向對象的深入理解二 | |
面向對象的深入理解三 | |
winform基礎 | Winform基礎 |
winform中常用的控件 | |
面向過程 | 三種循環的比較 |
C#中的方法(上) | |
我們常見的數組 | |
面向對象 | 思想的轉變 |
C#中超級好用的類 | |
C#中析構函數和命名空間的妙用 | |
C#中超級好用的字符串 | |
C#中如何快速處理字符串 | |
值類型和引用類型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File類 | |
多態 | |
C#中其它一些問題的小節 | |
GDI+ | 這些年我收集的GDI+代碼 |
這些年我收集的GDI+代碼2 | |
HTML概述以及CSS | 你不能忽視的HTML語言 |
你不能忽視的HTML語言2精編篇 | |
你不能忽視的HTML語言3 | |
CSS基本相關內容--中秋特別奉獻 | |
CSS基本相關內容2 | |
JavaScript基礎 | JavaScript基礎一 |
jQuery | jQuery(內涵: jquery選擇器) |