<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1、XMLReader為抽象類,其派生類有:
•XmlReader reader =new XmlTextReader(xmlFile); •XmlReader reader =new XmlNodeReader(xmNode);
2、XMLWriter為抽象類,其派生類有
XmlDocument和XElement在讀取Xml時要將整個Xml檔案放到記憶體中去操作,這樣做操作簡單,但是很費記憶體。而在有些場景下我們必須考慮儘可能節省記憶體,這時候就該XmlReader和XmlWriter出場了。
XmlReader非常類似於SAX。它們最大的區別是SAX是一種推模型(所有XML資料都必須由應用程式處理,無論是否需要這些資料),XmlReader是一種拉模型(如果不需要所有的資料,就不需要處理它們)。
XmlReader讀取Xml需要通過Read()實體方法,不斷讀取Xml檔案中的宣告,節點開始,節點內容,節點結束,以及空白等等,直到檔案結束Read()方法返回false。
(1)使用靜態方法Create(),返回一個XmlReader物件。
(2)Read()方法可以進入下一個節點。XmlReader類還可以讀取強型別化的資料,它有幾個ReadValuesAs方法,如、ReadValueAsDouble、ReadValueAsBoolean等。
(3)獲取屬性資料:AttributeCountry屬性確定屬性個數。GetAttribute()方法按照名稱或索引來獲取屬性,如果要一次迭代一個屬性就可以使用MoveToFirstAttribute()和MoveToNextAttribute()方法。
XmlReader tr = XmlReader.Create("book.xml"); while (tr.Read()){ if (tr.NodeType == XmlNodeType.Element){ for (int i = 0; i < tr.AttributeCount; i++){ richTextBox1.AppendText(tr.GetAttribute(i)+"rn"); } } }
有時不但要知道檔案的格式是規範的,還是確定檔案是有效的。
XmlReader可以使用XmlReaderSettings,根據XSD模式驗證XML。
XSD模式新增到XMLSchemaSet中,通過Schema屬性可以存取XMLSchemaSet。XsdValidate屬性還必須設定為ture,這個屬性預設為flase.
XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; settings.IgnoreWhitespace = true; XmlReader reader = XmlReader.Create("Customer2.xml", settings);//settings引數 為可選。 List lists = new List(); CustomerInfo cust = null; while (reader.Read())//讀取下一個節點 { if (reader.NodeType == XmlNodeType.Element) { switch (reader.Name) { case "row": cust = new CustomerInfo(); if (reader.HasAttributes)//因屬性不是檔案結構的一部分,要專門檢查。屬性HasValue是否有值;IsEmptyElement:是否為空元素 { cust.AppId = reader.GetAttribute("AppID"); cust.Version = reader.GetAttribute("Version"); } break; case "CustomerID": cust.CustomerID = reader.ReadString(); break; case "CompanyName": cust.CompanyName = reader.ReadString(); break; default: break; } } }
下面的範例讀取一個內聯 BinHex 編碼影象。 BinHex 資料嵌入到 元素中。 BinaryWriter 用於建立一個新的二進位制資料檔案。
public static void BinHexDecodeImageFile() { byte[] buffer = new byte[1000]; int readBytes = 0; using (XmlReader reader = XmlReader.Create("output.xml")) { FileStream outputFile = new FileStream(@"C:artFilesdatanewImage.jpg", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write); // Read to the image element. reader.ReadToFollowing("image"); // Read the BinHex data. Console.WriteLine("rnReading BinHex..."); BinaryWriter bw = new BinaryWriter(outputFile); while ((readBytes = reader.ReadElementContentAsBinHex(buffer, 0, 50))>0) { bw.Write(buffer, 0, readBytes); } outputFile.Close(); } }
與XmlReader一樣,XmlWriter類以只向前、未快取的方式 進行寫入。
1、寫Xml檔案宣告
WriteStartDocument方法可以接受一個bool引數(表示standalone,是否為獨立檔案)或者不指定引數standalone保持預設值
xmlWriter.WriteStartDocument(false|true);
注意在使用WriteStartDocument方法後最好呼叫xmlWrite.WriteEndDocument()方法來關閉所有可能未關閉標籤
2、寫xml節點以及屬性
//寫節點 xmlWriter.WriteStartElement("cat"); //給節點新增屬性 xmlWriter.WriteAttributeString("color", "white"); //給節點內部新增文字 xmlWriter.WriteString("I'm a cat"); xmlWriter.WriteEndElement(); //或者通過WriteElementString(string,string)方法寫xml節點同時寫下節點值,如下 xmlWriter.WriteElementString("pig", "pig is great");
3、寫CData
xmlWriter.WriteCData("dog is dog");
4、如新增註釋
xmlWriter.WriteComment("*** ");
5、如何設定XmlWriter的輸出格式,解決輸出UTF-16問題
設定xml輸出格式,需要通過XmlWriterSettings類,如下程式碼
XmlWriterSettings settings = new XmlWriterSettings(); //要求縮排 settings.Indent = true; //注意如果不設定encoding預設將輸出utf-16 //注意這兒不能直接用Encoding.UTF8如果用Encoding.UTF8將在輸出文字的最前面新增4個位元組的非xml內容 settings.Encoding = new UTF8Encoding(false); //設定換行符 settings.NewLineChars = Environment.NewLine;
6、寫入其他物件中
XmlWriter類可以把Xml寫入一個流、檔案、StringBuilder、TextWriter或另一個XmlWriter物件中。
7、名稱空間的支援
XmlTextWriter w = new XmlTextWriter(Console.Out); w.WriteStartElement("x","root","urn:1"); w.WriteStartElement("y","item","urn:1"); w.WriteAttributeString("abc","urn:1","xyz"); w.WriteEndElement(); w.WriteEndElement(); w.Close();
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "t"; settings.NewLineOnAttributes = false; settings.ConformanceLevel = ConformanceLevel.Auto; settings.OmitXmlDeclaration = false; //注意如果不設定encoding預設將輸出utf-16 //注意這兒不能直接用Encoding.UTF8如果用Encoding.UTF8將在輸出文字的最前面新增4個位元組的非xml內容 settings.Encoding = new UTF8Encoding(false); //設定換行符 settings.NewLineChars = Environment.NewLine; XmlWriter writer = XmlWriter.Create("CustomerNewElementArribute.xml", settings);//settings引數 為可選。 //使用xmlwriter寫入StringBuiler和Stream: //StringBuilder builder = new StringBuilder(); //XmlWriter writer = XmlWriter.Create(builder, settings); //MemoryStream stream = new MemoryStream(); //XmlWriter writer = XmlWriter.Create(stream, settings); writer.WriteStartDocument();//寫Xml宣告:可選參數列示standalone,是否為獨立檔案 writer.WriteComment("XXX"); //寫註釋 writer.WriteStartElement("Table");//寫複雜元素(元素含有子元素) for (int i = 1; i < 10; i++) { writer.WriteStartElement("row"); writer.WriteAttributeString("Version", "2.0"); writer.WriteAttributeString("AppID", "111"); writer.WriteElementString("CustomerID", "cmz" + i.ToString());//寫簡單元素 writer.WriteElementString("CompanyName", "程沐喆" + i.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush(); writer.Close();
//用 WriteBinHex 方法編寫 BinHex 資料。 BinHex 資料嵌入在 元素。 int bufferSize = 1000; byte[] buffer = new byte[bufferSize]; int readBytes = 0; using (XmlWriter writer = XmlWriter.Create("output.xml")) { FileStream inputFile = new FileStream(@"C:sunset.jpg", FileMode.OpenOrCreate,FileAccess.Read, FileShare.Read); writer.WriteStartDocument(); writer.WriteStartElement("image"); BinaryReader br = new BinaryReader(inputFile); Console.WriteLine("rnWriting BinHex data..."); do { readBytes = br.Read(buffer, 0, bufferSize); writer.WriteBinHex(buffer, 0, readBytes); } while (bufferSize <= readBytes); br.Close(); writer.WriteEndElement();// writer.WriteEndDocument(); }
到此這篇關於C#使⽤XmlReader和XmlWriter操作XML⽂件的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45