在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

在.NET Framework中簡單處理XML數據(一)

在.NET Framework中簡單處理XML數據(一)

更新時間:2022-05-14 文章作者:未知 信息來源:網絡 閱讀次數:

本文假設你已熟悉XML和.NET Framework

前言 在.NET Framework中,XmlTextReader和XmlTextWriter類提供了對xml數據的讀和寫操作。在本文中,作者講述了XML閱讀器(Reader)的體系結構及它們怎樣與XMLDOM 和SAX 解釋器結合。作者也演示了怎么樣運用閱讀器分析和驗證XML文檔,怎么樣創建格式良好的XML文檔,以及怎么樣用函數讀/寫基于Base64和BinHex編碼的大型的XML文檔。最后,作者講了怎么樣實現一個基于流的讀/寫分析器,它把讀寫器都封裝在一個單獨的類里。

大概三年前,我參加了一個軟件研討會,主題是“沒有XML,就沒有編程的未來”。XML確實也在一步一步的發展,它已經嵌入到. NET Framework中了。在本文中,我將講解. NET Framework中用于處理XML文檔的API的角色和它的內部特性,然后我將演示一些常用的功能。

從MSXML到.net的XML

在. NET Framework出現之前,你習慣使用MSXML服務----一個基于COM的類庫---寫windows的XML的驅動程序。不像. NET Framework中的類,MSXML類庫的部分代碼比API更深,它完全的嵌在操作系統的底層。MSXML的確能夠與你的應用程序通信,但是它不能真正的與外部環境結合。

MSXML類庫能在win32中被導入,也能在CLR中運用,但它只能作為一個外部服務器組件使用。但是基于.NET Framework的應用程序能直接的用XML類與.NET Framework 的其它命名空間整合使用,并且寫出來的代碼易于閱讀。

作為一個獨立的組件,MSXML分析器提供了一些高級的特性如異步分析。這個特性在.NET Framework中的XML類及.NET Framework的其它類都沒有提供,但是,NET Framework中的XML類與其它的類整合可以很輕易的獲得相同的功能,在這個基礎上你可以增加更多的功能。

.NET Framework中的XML類提供了基本的分析、查詢、轉換XML數據的功能。在.NET Framework中,你可以找到支持Xpath查詢和XSLT轉換的類,及讀/寫XML文檔的類。另外,.NET Framework也包含了其它處理XML的類,例如對象的序列化(XmlSerializer和the SoapFormatter類),應用程序配置(AppSettingsReader類),數據存儲(DataSet類)。在本文中,我只討論實現基本XML I/O操作的類。

XML分析模式

既然XML是一種標記語言,就應該有一種工具按一定的語法來分析和理解存儲在文檔中信息。這個工具就是XML分析器---一個組件用于讀標記文本并返回指定平臺的對象。

所有的XML分析器,不管它屬于哪個操作平臺,不外乎都分以下的兩類:基于樹或者基于事件的處理器。這兩類通常都是用XMLDOM(the Microsoft XML Document Object Model)和SAX(Simple API for XML)來實現。XMLDOM分析器是一個普通的基于樹的API---它把XML文檔當成一個內存結構樹呈現。SAX分析器是基于事件的API----它處理每個在XML數據流中的元素(它把XML數據放進流中再進行處理)。通常,DOM能被一個SAX流載入并執行,因此,這兩類的處理不是相互排斥的。

總的來說,SAX分析器與XMLDOM分析器正好相反,它們的分析模式存在著極大的差別。XMLDOM被很好的定義在它的functionalition集合里面,你不能擴展它。當它在處理一個大型的文檔時,它要占用很大內存空間來處理functionalition這個巨大的集合。

SAX分析器利用客戶端應用程序通過現存的指定平臺的對象的實例去處理分析事件。SAX分析器控制整個處理過程,把數據“推出”到處理程序,該處理程序依次接受或拒絕處理數據。這種模式的優點是只需很少的內存空間。

.NET Framework完全支持XMLDOM模式,但它不支持SAX模式。為什么呢?因為.NET Framework支持兩種不同的分析模式:XMLDOM分析器和XML閱讀器。它顯然不支持SAX分析器,但這并不意味它沒有提供類似SAX分析器的功能。通過XML閱讀器SAX的所有的功能都能很容易的實現及更有效的運用。不像SAX分析器,.NET Framework的閱讀器整個都運作在客戶端應用程序下面。這樣,應用程序本身就可以只把真正需要的數據“推出”,然后從XML數據流中跳出來。而SAX分析模式要處理所有的對應用程序有用和無用的信息。

閱讀器是基于.NET Framework流模式工作的,它的工作方式類似于數據庫的游標。有趣的是,實現類似游標分析模式的類提供對.NET Framework中的XMLDOM分析器的底層支持。XmlReader、XmlWriter兩個抽象類是所有.NET Framework中XML類的基礎類,包括XMLDOM類、ADO.NET驅動類及配置類。所以在.NET Framework中你有兩種可選的方法去處理XML數據。用XmlReader和XmlWriter類直接處理XML數據,或者用XMLDOM模式處理。更多的關于在.NET Framework中讀文檔的介紹可以參見MSDN 2002 年八月刊的Cutting Edge欄目文章。

XmlReader類

XML閱讀器支持一個編程接口,接口用于連接XML文檔,“推出”你要的數據。如果你更深入去了解閱讀器,你會發現閱讀器工作原理類似于我們的桌面應用程序從數據庫中取出數據的原理。數據庫服務返回一個游標對象,它包含所有查詢結果集,并返回指向目標數據集的開始地址的引用。XML閱讀器的客戶端收到一個指向閱讀器實例的引用。該實例提取底層的數據流并把取出的數據呈現為一棵XML樹。閱讀器類提供只讀、向前的游標,你可以用閱讀器類提供的方法滾動游標遍歷結果集中的每一條數據。

從閱讀器中看XML文檔不是一個標簽文本文件,而是一個序列化的節點集合。它是.NET Framework中的一種特殊的游標模式;在.NET Framework中,你找不到其它的任何一個類似的API函數。

閱讀器和XMLDOM分析器有幾點不同的地方。XML閱讀器是只進的,它沒有父、子、祖宗、兄弟節點的概念,而且是只讀的。在.NET Framework中,讀寫XML文檔是分為兩種完全不同的功能,分別由XmlReader和XmlWriter類來完成。要編輯XML文檔,你可以用XMLDOM分析器,或者你自己設計一個類來實現這兩種功能。讓我們開始分析閱讀器的程序功能。

XmlReader是一個抽象類,你可以繼承并擴展它的功能。用戶程序一般都基于下面的三種類:XmlTextReader、XmlValidatingReader或者 XmlNodeReader類。所有的這些類都有如圖一的屬性和圖二的方法。要注意的是,某些屬性的值實際上依賴于實際的某個閱讀器類,不同的類與基類可能不同。因此,在圖一中每個屬性的說明都是以基類為準的。例如,CanResolveEntity屬性在XmlValidatingReader類中只返回true;而在其它的閱讀器類中它卻可以設為false。同樣的,在圖二中的某些方法的實際返回值對不同的類可能不同。例如,如果節點類型不是元素節點(element node),所有包含Atrributes的方法的返回值類型都是void。

XmlTextReader類用只進,只讀的方式快速訪問XML數據流。閱讀器先驗證XML文檔是否是格式良好的,如果不是則拋出一個異常。XmlTextReader 檢查 DTD 的格式是否良好,但不使用 DTD 對文檔進行驗證。XmlTextReader通過XML文檔的文件名,或它的URL,或者從文件流中載入XML文檔,然后快速的處理XML文檔數據。如果你需要對文檔的數據進行驗證,你可以用XmlValidatingReader類。

可以用多種方法創建XmlTextReader類的實例,從硬盤中加載文件,或從URL地址中加載,流(streams)中加載,還有就是從文本中讀入XML文檔數據:

XmlTextReader reader = new XmlTextReader(file);

注意,所有XmlTextReader類的公共(public)構造函數都要求你指定數據源,數據源可以是stream、文件或者其它。XmlTextReader默認的構造函數是受保護的(protected),所以不能直接使用。像.NET Framework中所有的閱讀器類一樣(如SqlDataReader類),一旦閱讀器對象連接并打開,你就可以用Read方法去訪問數據了。開始的時候只能用Read方法把指針移到第一個元素;然后我們可以用Read方法或其它方法(如Skip, MoveToContent和ReadInnerXml)移動指針到下一個節點元素。要處理整個XML文檔的內容,可以根據Read方法的返回值用一個循環遍歷文檔內容,因為Read方法返回一個布爾值,當讀到文檔的尾節點時,Read方法返回false,否則它返回true。



Figure 3 Outputting an XML Document Node Layout

string GetXmlFileNodeLayout(string file)
{
// 創建一個XmlTextReader類使它指向目標XML文檔
XmlTextReader reader = new XmlTextReader(file);

// 循環取出節點的文本并放入到StringWriter對象實例中
StringWriter writer = new StringWriter();
string tabPrefix = "";

while (reader.Read())
{
// 寫開始標志,如果節點類型為元素
if (reader.NodeType == XmlNodeType.Element)
{
//根據元素所處節點的深度,加入reader.Depth個tab符,然后把元素名寫入到<>中。
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}<{1}>", tabPrefix, reader.Name);
}
else
{
//寫結束標志,如果節點類型為元素
if (reader.NodeType == XmlNodeType.EndElement)
{
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}</{1}>", tabPrefix, reader.Name);
}
}
}

// 輸出到屏幕
string buf = writer.ToString();
writer.Close();

// 關閉流
reader.Close();

return buf;
}


圖三演示了一個簡單的用于輸出一個給定的XML文檔的節點元素的函數。該函數先打開一個XML文檔,然后用循環處理XML文檔中所有的內容。每次調用Read方法,閱讀器的指針都會向下移一個節點。大部分情況下,用Read方法可以處理的元素節點,但有時候,當你從一個節點移動到下一個節點時,可能是在兩個不同類型的節點間移動。但是Read方法不能在屬性節點之間移動。閱讀器的MoveToContent方法可以讓指針從頭部節點位置跳到第一個內容節點位置。在ProcessingInstruction, DocumentType, Comment, Whitespace和SignificantWhitespace類型節點中也可以用Skip方法移動指針。
每個節點的類型是XmlNodeType枚舉值中的一種,在如圖三所示的代碼中,我們只用了其中的兩種類型:Element 和 EndElement。輸出源碼重新定制了原始的文檔結構,它丟棄或者說是忽略了XML元素的屬性和節點內容,只輸出了元素節點名。假設我們運用了下面的XML片斷:

<mags>
<mag name="MSDN Magazine">
MSDN Magazine
</mag>
<mag name="MSDN Voices">
MSDN Voices
</mag>
</mags>
用上面的程序輸出的結果如下:

<mags>
<mag>
</mag>
<mag>
</mag>
</mags>
子節點的縮進量是根據閱讀器的深度屬性(Depth屬性)設置的,Depth屬性返回一個整形的數據,它表示當前節點的嵌套層次。所有文本都放在StringWriter對象中(一個非常方便的基于流的封裝了StrigBuilder類的類)。
如前所述,閱讀器不會自動通過Read方法訪問屬性節點。要訪問當前元素的屬性節點集合,必須用一個簡單的用MoveToNextAttribute方法的返回值控制的循環去遍歷該集合。下面的代碼用于訪問當前節點的所有屬性,并把屬性的名稱和它的值用逗號分開組合成一個字符串:
if (reader.HasAttributes)
while(reader.MoveToNextAttribute())
buf += reader.Name + "=\"" + reader.Value + "\",";
reader.MoveToElement();
當你完成對屬性集的處理時,調用MoveToElement方法使指針返回到屬性所屬的元素節點。準確的說,MoveToElement方法并不是真正的移動指針,因為在處理屬性集時指針從來就沒有從元素節點中移開。MoveToElement方法只不過指向某個內部成員,并依次取得成員的值。例如,用Name屬性獲得某個屬性的屬性名,然后調用MoveToElement方法把指針移到其所屬的元素節點處。但是當你不需要繼續處理別的節點時,就不必再調用MoveToElement方法了。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 免费人成自慰网站| 天堂网在线免费观看| 九九热99视频| 一道本视频在线观看| 欧美三级理论片| 成人三级视频在线播放| 99热这里只有精品免费| jizzzz日本| 免费看又黄又无码的网站| 欧美 激情 在线| 亚洲综合欧美激情| 午夜免费看毛片| 色播五月综合网| 精品无码国模私拍视频| 国产高潮免费视频| aa免费在线观看| 亚洲精品手机在线观看| 中文字幕亚洲影院| 九色在线视频观看| 亚洲最大成人在线观看| 午夜免费高清视频| 精品久久久99| 奇米777四色影视在线看| 日韩久久一级片| 中国丰满人妻videoshd| 男人操女人免费| 成年人网站免费视频| 18岁视频在线观看| 色香蕉在线观看| 天天看片天天操| 免费看一级大黄情大片| 大陆极品少妇内射aaaaaa| 91女神在线观看| 久久久久久久免费视频| 成人午夜视频免费在线观看| 久久久天堂国产精品| 免费一级淫片aaa片毛片a级| 青青草视频国产| 一区二区在线播放视频| 艳母动漫在线观看| 国产精欧美一区二区三区白种人| 一本大道熟女人妻中文字幕在线| 日本女人高潮视频| 日韩av资源在线| 日韩中文字幕组| av无码精品一区二区三区| 欧美大尺度做爰床戏| a级片一区二区| 国产av人人夜夜澡人人爽麻豆 | 黑森林福利视频导航| 亚洲天堂国产视频| 国产九九在线视频| 日韩网站在线免费观看| 成人一区二区三| 能看的毛片网站| 少妇人妻大乳在线视频| 污网站免费在线| 国产911在线观看| 天天成人综合网| 牛夜精品久久久久久久| 91av视频免费观看| 无码少妇一区二区三区芒果| 成人在线观看a| 午夜欧美福利视频| 欧美一级黄色影院| 97超碰在线人人| 成人免费xxxxx在线视频| 国产精品av免费| 亚洲综合色在线观看| 日韩在线不卡一区| 樱空桃在线播放| 天堂一区在线观看| 在线观看免费的av| 欧美一级免费在线| av在线免费观看国产| 欧美与动交zoz0z| 国产精品探花在线播放| 99999精品| 成人在线视频一区二区三区| 人妻少妇精品无码专区二区| 国产黄色激情视频| 国产成人免费高清视频| 国产日韩视频在线播放| 国产免费中文字幕| 欧美变态另类刺激| 嫩草视频免费在线观看| 手机在线成人免费视频| 福利网在线观看| 国产v片免费观看| 成年人视频大全| 成人午夜免费剧场| a级黄色一级片| 一二三av在线| 北条麻妃在线一区| 无尽裸体动漫2d在线观看| 国产美女18xxxx免费视频| 黄色在线视频网| 国产素人在线观看| 777视频在线| 日本a视频在线观看| 日本女优爱爱视频| www.午夜色| 播放灌醉水嫩大学生国内精品| 日日噜噜夜夜狠狠久久丁香五月| 欧美激情亚洲天堂| 欧美极品少妇无套实战| 久久久久久综合网| 91免费视频网站在线观看| av无码精品一区二区三区| 日韩a一级欧美一级| 日韩不卡的av| 麻豆视频传媒入口| 久久人人爽人人片| 日韩少妇内射免费播放18禁裸乳| 国产一区二区三区在线免费| 成人一级片网站| 亚洲一二三av| 在线观看岛国av| 国产一线二线三线女| 神马午夜伦理影院| 欧美精品第三页| 麻豆av免费在线| 国产精品亚洲a| 永久免费网站视频在线观看| 亚洲高清视频免费| 成人一区二区免费视频| 国产又黄又大又粗视频| 性鲍视频在线观看| 国产又黄又大又粗视频| 日韩精品―中文字幕| 一级日本黄色片| 秋霞无码一区二区| 天天爽夜夜爽一区二区三区| 国产探花在线观看视频| 精品一区二区中文字幕| 亚洲精品免费一区亚洲精品免费精品一区| 久久久精品三级| 99视频在线免费播放| 天堂网在线免费观看| 久久99国产精品一区| 污网站免费在线| 岳毛多又紧做起爽| 在线免费观看av网| 中文字幕日本最新乱码视频| 日韩精品视频网址| 成人一级生活片| 91av俱乐部| 成人黄色大片网站| 日韩视频 中文字幕| 国产精品igao激情视频| 三日本三级少妇三级99| 日本www在线视频| 成人精品小视频| 国产又大又黄又猛| 狠狠热免费视频| 亚洲高清视频免费| 在线观看视频黄色| 久久精品在线免费视频| 夜夜添无码一区二区三区| 久久精品影视大全| www.av蜜桃| 国产九九在线视频| 欧美一级免费播放| 色网站在线视频| 日本午夜激情视频| 日韩a级黄色片| 成人午夜精品久久久久久久蜜臀| 国产自产在线视频| 黄色一级在线视频| 国产97色在线 | 日韩| 国产欧美精品aaaaaa片| 免费在线激情视频| 91淫黄看大片| 日韩av自拍偷拍| 国产成年人视频网站| 欧美精品自拍视频| 国产在线播放观看| 国产黄视频在线| 91九色在线观看视频| 国产又大又黄又粗又爽| 色姑娘综合天天| 97中文字幕在线| 免费在线观看的毛片| 第四色婷婷基地| 黄色www在线观看| 中国 免费 av| 黄色www网站| 分分操这里只有精品| 男人女人黄一级| 五月婷婷之综合激情| 中文字幕一区久久| 亚洲国产成人精品无码区99| 欧美自拍小视频| 国产老熟妇精品观看| 久久精品网站视频| 公共露出暴露狂另类av| 五月天视频在线观看| av丝袜天堂网| 成人中文字幕在线播放| 九色porny自拍|