程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#操作XML

C#操作XML

編輯:C#入門知識

使用XmlReader類讀XML文件   要讀取的XML文件(XML.xml)內容:   <?xml version="1.0" encoding="utf-8"?>   <根節點>     <字符串>測試字符串!!!ABCD</字符串>     <數字 屬性1="李志偉" 屬性2="lizhiwei">123.456</數字>   </根節點>   讀取的XML文件內容的代碼:       class Program       {           static void Main(string[] args)           {               XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml");               while (rxml.Read())//讀取節點               { //操作當前節點                   Console.WriteLine("節點名:" + rxml.Name + "\t節點類型:" + rxml.NodeType);                   for (int i = 0; i < rxml.AttributeCount; i++)                   {                       Console.WriteLine("屬性:"+rxml.GetAttribute(i));//讀取屬性                   }                   if (rxml.Name == "數字")                   { //讀取數字                       Console.WriteLine("數字值:" + rxml.ReadElementContentAsDouble()*100);                   }                   else if (rxml.Name == "字符串")                   {//讀取字符串                       Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());                   }                   Console.WriteLine("====================================================");               }               rxml.Close();               Console.Read();           }       }   (3)使用XmlReader類進行驗證XML文件   XML.xml文件不變,增加XMLSchema.xsd文件如下:   <?xml version="1.0" encoding="utf-8"?>   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">     <xs:element name="根節點">       <xs:complexType>         <xs:sequence>           <xs:element name="字符串" type="xs:string"/>           <xs:element name="數字">             <xs:complexType>               <xs:attribute name="屬性1" type="xs:string"/>               <!-- 未定義屬性2-->             </xs:complexType>           </xs:element>         </xs:sequence>       </xs:complexType>     </xs:element>   </xs:schema>   程序代碼:       class Program       {           static void Main(string[] args)           {               XmlReaderSettings settings = new XmlReaderSettings();               settings.Schemas.Add(null, @"..\..\XML\XMLSchema.xsd");               settings.ValidationType = ValidationType.Schema;               settings.ValidationEventHandler += new ValidationEventHandler(Error);               XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml", settings);               while (rxml.Read())//讀取節點               {//操作當前節點                   Console.WriteLine("節點名:" + rxml.Name + "\t節點類型:" + rxml.NodeType);                   for (int i = 0; i < rxml.AttributeCount; i++)                   {                       Console.WriteLine("屬性:"+rxml.GetAttribute(i));//讀取屬性                   }                   if (rxml.Name == "數字")                   {//讀取數字                       Console.WriteLine("數字值:" + rxml.ReadElementContentAsDouble()*100);                   }                   else if (rxml.Name == "字符串")                   {//讀取字符串                       Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());                   }                   Console.WriteLine("====================================================");               }               rxml.Close();               Console.Read();           }           //讀取XML錯誤時調用的方法           static void Error(object sender, ValidationEventArgs e)           {               Console.WriteLine("########XML格式出錯:"+e.Message);           }       }   (4)使用XmlWriter類寫XML文件   XmlWriter類可以吧XML數據寫入一個流、文件、StringBuilder、TextWriter或另一個XmlWriter對象。與XmlReader一樣XmlWriter類以只向前、未緩存的方式進行寫入。XmlWriter類的可配置性很高,可以指定是否縮進內容、縮進量、在屬性中使用什麼引號,以及是否支持名稱空間等信息。與XmlReader類一樣,這個配置使用XmlWriterSettings對象。       class Program       {           static void Main(string[] args)           {               XmlWriterSettings settings = new XmlWriterSettings();               settings.Indent = true;//設置使用縮進               settings.NewLineOnAttributes = true;//設置將屬性寫入新行               XmlWriter wxml = XmlWriter.Create(@"..\..\XML\newXML.xml",settings);               wxml.WriteStartDocument();//寫入XML的申明               wxml.WriteStartElement("根節點");//開始寫根節點==               wxml.WriteStartElement("節點");//開始寫節點               wxml.WriteAttributeString("姓名", "李志偉");//寫屬性               wxml.WriteAttributeString("年齡", "20");//寫屬性               wxml.WriteString("李志偉lizhiwei");//寫節點內容               wxml.WriteEndElement();//節點寫完               wxml.WriteElementString("標題","測試節點!!!ABCD");//直接寫無屬性節點               wxml.WriteEndElement();//根節點寫完==               wxml.Close();               Console.WriteLine("OK!");               Console.Read();           }       }   3.使用XmlDocument、XmlNode實現DOM讀寫XML   (1)測試的XML文件(XML.xml)   <?xml version="1.0" encoding="utf-8"?>   <根節點>     <節點>元素類容</節點>     <數字 屬性1="李志偉" 屬性2="lizhiwei">123.456</數字>     <數字>123456.789</數字>     <子節點>       <整數>123456</整數>       <字符串>李志偉</字符串>       <空節點 作用="測試插入節點">       </空節點>     </子節點>   </根節點>   (2)測試查找與插入節點的代碼       class Program       {           static void Main(string[] args)           {               XmlDocument xml = new XmlDocument();               xml.Load(@"..\..\XML\XML.xml");//加載XML文件               //得到一組節點               XmlNodeList nodes = xml.GetElementsByTagName("數字");               foreach (XmlNode node in nodes)               {                   Console.WriteLine("節點=======" + node.Name + "\t" + node.InnerText);                   foreach (XmlAttribute a in node.Attributes)                   {                       Console.WriteLine("屬性:" + a.Name + "\t" + a.Value);                   }               }               //創建要插入的節點               XmlElement element = xml.CreateElement("插入節點");//創建節點               element.SetAttribute("姓名", "李志偉");//設置屬性               element.SetAttribute("年齡", "20");//設置屬性               XmlElement child = xml.CreateElement("插入子節點");//創建節點               child.InnerText = "測試插入節點!ABCD";//設置節點內容               element.AppendChild(child);               //設置插入節點的位置               nodes = xml.GetElementsByTagName("空節點");               nodes[0].AppendChild(element);//插入節點               xml.Save(@"..\..\XML\XML.xml");               Console.WriteLine("OK!");               Console.Read();           }       }   注意:在使用XmlDocument的GetElementById方法時,需要使用DTD定義哪些屬性是ID類型的屬性,否者調用GetElementById時返回null。   4.使用XPathNavigator類快速查詢XML文檔元素   (1)System.Xml.XPath命名空間   System.Xml.XPath命名空間中包含的類用於定義光標模型,該模型可將 XML 信息項作為 XQuery 1.0 和 XPath 2.0 數據模型的實例進行導航和編輯。   System.Xml.XPath命名空間重要的類:   XPathDocument   提供整個XML文檔的視圖,只讀   XPathNavigator   為定位和編輯 XML 數據提供游標模型。   XPathNodeIterator   在一組選中的節點上提供迭代器。   XPathItem   表示 XQuery 1.0 和 XPath 2.0 數據模型中的項。   XPathExpression   提供表示已編譯的 XPath 表達式的類型化類。   XPathException   提供在處理 XPath 表達式的過程中發生錯誤時所引發的異常。   (2)XPathNavigator類介紹   XPathNavigator類在System.Xml.XPath命名空間中,XPathNavigator類包含移動和選擇所需元素的所有方法,分別是MoveXXX()與SelectXXX()方法。使用XPathNavigator類多數情況下是需要查找XML文檔元素,而不是修改XML文檔。   使用XPathNavigator類需與System.Xml.XPath命名空間裡的其它類一起使用,詳細請查看System.Xml.XPath命名空間。   (3)使用XPathNavigator對象查詢XML元素   測試的XML文件   <?xml version="1.0" encoding="utf-8"?>   <根節點>     <節點 節點名="A">       <子節點1>AAA子節點1</子節點1>       <子節點2>AAA子節點2</子節點2>       <子節點3>AAA子節點3</子節點3>     </節點>     <節點 節點名="B">       <子節點1>BBB子節點1</子節點1>       <子節點2>BBB子節點2</子節點2>       <子節點3>BBB子節點3</子節點3>     </節點>     <節點 節點名="A">       <子節點1>CCC子節點1</子節點1>       <子節點2>CCC子節點2</子節點2>       <子節點3>CCC子節點3</子節點3>     </節點>   </根節點>   測試的代碼       class Program       {           static void Main(string[] args)           {               XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");               XPathNavigator nav = xml.CreateNavigator();               XPathNodeIterator iter = nav.Select("根節點/節點[@節點名='A']");//查詢               while (iter.MoveNext())//下一個結果               {                   Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);                   XPathNodeIterator temp =   iter.Current.SelectDescendants(XPathNodeType.Element,false);//查詢                   while (temp.MoveNext())//下一個結果                   {                       Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);                   }               }               Console.WriteLine("OK!");               Console.Read();           }   }   注意:有關XPath表達式的語法請查詢Visual Studio文檔!   (4)使用XPathNavigator對象查詢並修改XML元素   使用XmlDocument對象創建的XPathNavigator對象,可以修改XML文檔。上例的XML文檔不變,代碼如下:       class Program       {           static void Main(string[] args)           {               XmlDocument xml = new XmlDocument();               xml.Load(@"..\..\XML\XML.xml");               XPathNavigator nav = xml.CreateNavigator();               XPathNodeIterator iter = nav.Select("根節點/節點[@節點名='A']");//查詢               while (iter.MoveNext())               {                   Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);                   XPathNodeIterator temp =   iter.Current.SelectDescendants(XPathNodeType.Element,false);//查詢                   while (temp.MoveNext())                   {                       Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);                       temp.Current.InsertBefore("<插入子節點>李志偉</插入子節點>");//插入節點                   }               }               xml.Save(@"..\..\XML\XML.xml");               Console.WriteLine("OK!");               Console.Read();           }   }   5.XSL轉換數據格式   (1)System.Xml.Xsl命名空間   System.Xml.Xsl命名空間為“可擴展樣式表轉換”(XSLT) 轉換提供支持。它支持“W3C XSL 轉換 (XSLT) 1.0 版推薦”(www.w3.org/TR/xslt)。   System.Xml.Xsl命名空間重要的類:   XslCompiledTransform   使用 XSLT 樣式表轉換 XML 數據。   XsltArgumentList   包含數目可變的參數(這些參數是 XSLT 參數,或者是擴展對象)。   XsltContext   可擴展樣式表轉換語言 (XSLT) 處理器的當前執行上下文。    XsltSettings    指定執行 XSLT 樣式表時要支持的 XSLT 功能。   (2)使用XslCompiledTransform類轉換數據格式   可以使用XslCompiledTransform類把XML文件數據轉換成其他格式的文件,本例使用XSLT文件(XSLTFile.xslt)把XML文件(XML.xml)轉換成一個HTML文檔。   XSLTFile.xslt文件內容如下:   <?xml version="1.0" encoding="utf-8"?>   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"       xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">     <xsl:template match="/">       <html>         <head><title>李志偉</title></head>         <body><table border="1"><xsl:apply-templates/></table></body>       </html>     </xsl:template>     <xsl:template match="根節點">       <xsl:apply-templates select="節點"/>     </xsl:template>     <xsl:template match="節點">       <tr>         <td><xsl:apply-templates select="子節點1"/></td>         <td><xsl:apply-templates select="子節點2"/></td>       </tr>     </xsl:template>   </xsl:stylesheet>   XML.xml文件內容如下:   <?xml version="1.0" encoding="utf-8"?>   <根節點>     <節點>       <子節點1>第一列01</子節點1>       <子節點2>第二列01</子節點2>     </節點>     <節點>       <子節點1>第一列02</子節點1>       <子節點2>第二列02</子節點2>     </節點>   </根節點>   程序代碼如下:       class Program       {           static void Main(string[] args)           {               XslCompiledTransform trans = new XslCompiledTransform();               trans.Load(@"..\..\XML\XSLTFile.xslt");//加載XSLT文件               trans.Transform(@"..\..\XML\XML.xml", @"..\..\XML\HTML.html");//轉換HTML文件               Console.WriteLine("OK!");               Console.Read();           }       }   注意:XSLT文件的語法可以到http://www.w3school.com.cn/xsl/網站學習!   (3)使用XsltArgumentList類綁定對象到命名空間   XSLTFile.xslt文件內容如下,注意修改的部分:   <?xml version="1.0" encoding="utf-8"?>   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"       xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"       xmlns:Test="urn:XslTest">     <xsl:template match="/">       <html>         <head><title>李志偉</title></head>         <body><table border="1"><xsl:apply-templates/></table></body>       </html>     </xsl:template>     <xsl:template match="根節點">       <xsl:apply-templates select="節點"/>     </xsl:template>     <xsl:template match="節點">       <tr>         <td><xsl:apply-templates select="子節點1"/></td>         <td><xsl:apply-templates select="子節點2"/></td>         <td><xsl:value-of select="Test:ShowText()"/></td>       </tr>     </xsl:template>   </xsl:stylesheet>   XML文件不變,程序代碼如下:       class Test       {           private int Count = 0;           public string ShowText()           {               return "李志偉,行數:" + (Count++);           }       }       class Program       {           static void Main(string[] args)           {               XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");               XslCompiledTransform trans = new XslCompiledTransform();               trans.Load(@"..\..\XML\XSLTFile.xslt");//加載XSLT文件               XmlWriter xw = new XmlTextWriter(@"..\..\XML\HTML.html", Encoding.UTF8);               XsltArgumentList arg = new XsltArgumentList();               Test test = new Test();               arg.AddExtensionObject("urn:XslTest", test);//綁定對象參數               XPathNavigator nav = xml.CreateNavigator();               trans.Transform(nav, arg, xw);//生成文件               xw.Close();               Console.WriteLine("OK!");               Console.Read();           }       }   (4)調試XSLT   使用VS 2010可以調試XSLT轉換XML文件的過程,可以在VS 2010 XSLT文件編輯器中下斷點。也可以使用:XslCompiledTransform trans = new XslCompiledTransform(true)的方式,在運行時調試。   注意:本節只是介紹使用XSLT轉換數據格式的基本使用,不做深入研究,更詳細信息請查看本人的其它相關文檔。   6.在XML中序列化對象   (1).NET對象序列化的方式介紹   二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Serialization.Formatters.Binary命名空間下。   XML序列化:對象序列化之後的結果是XML形式的,通過XmlSerializer 類來實現的,這個類位於System.Xml.Serialization命名空間下。XML序列化不能序列化私有數據。   SOAP序列化:對象序列化之後的結果符合SOAP協議,也就是可以通過SOAP 協議傳輸,通過System.Runtime.Serialization.Formatters.Soap命名空間下的SoapFormatter類來實現的。   (2)使用XmlSerializer序列化與反序列化       public class Test//被序列化對象       {           [XmlAttribute]           public string ID { set; get; }           [XmlElement]           public string Name { set; get; }           [XmlElement]           public int Age { set; get; }           [XmlElement]           public string Sex { set; get; }           [XmlElement]           public List<string> Interest { set; get; }           public override string ToString()           {               return "ID:" + ID + ",Name" + Name + ",Age" + Age + ",Sex" + Sex;           }       }       class Program       {           static void Main(string[] args)           {               //創建對象               Test test = new Test() { ID = "01", Name = "李志偉", Age = 20, Sex = "男" };               test.Interest = new List<string>();               test.Interest.Add("看電影");               test.Interest.Add("聽歌");               test.Interest.Add("看書");               //序列化               XmlTextWriter xmlw = new XmlTextWriter(@"..\..\XML\XML.xml", Encoding.UTF8);               XmlSerializer xmlser = new XmlSerializer(typeof(Test));               xmlser.Serialize(xmlw, test);//序列化               xmlw.Close();//關閉文件               Console.WriteLine("序列化成功,請查看XML文件!");               Console.ReadLine();               //反序列化               XmlTextReader xmlr = new XmlTextReader(@"..\..\XML\XML.xml");               Test temp = (Test)xmlser.Deserialize(xmlr);//反序列化               xmlr.Close();               Console.WriteLine("反序列化結果:" + temp);               Console.Read();           }   }   注意:本節只是介紹對象序列化成XML的基本方式,不做深入研究,更詳細信息請查看本人的其它相關文檔。   7.使用LINQ查詢XML文檔   (1)System.Xml.Linq命名空間   包含LINQ to XML的類。LINQ to XML是內存中的XML編程接口,使您可以輕松有效地修改XML文檔。使用LINQ to XML可以進行以下操作:從文件或流加載XML;將XML序列化為文件或流;使用功能構造從頭創建XML樹;使用LINQ查詢來查詢XML樹;操作內存中的XML樹;使用XSD驗證XML樹。組合使用這些功能將XML樹從一種形狀轉換為另一種形狀。   System.Xml.Linq命名空間較重要的類:   XDocument   表示 XML 文檔。   XComment   表示一個 XML 注釋。   XNamespace   表示一個 XML 命名空間。無法繼承此類。   XNode   表示 XML 樹中節點的抽象概念(元素、注釋、文檔類型、處理指令或文本節點)。   XElement   表示一個 XML 元素。   XAttribute   表示一個 XML 屬性。   XName   表示 XML 元素或屬性的名稱。   XText   表示一個文本節點。   (2)System.Xml.Linq命名空間類的基本使用       class Program       {           static void Main(string[] args)           {               XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;               Console.WriteLine(xml.Root.Name);//根節點名               Console.WriteLine(xml.Root.LastAttribute);//最後一個屬性               XNamespace ns = "http://www.cnblogs.com/LiZhiW/";               XElement root = new XElement(ns + "根節點",                   new XElement("節點", "節點內容"),                   new XElement("節點",                       new XElement("子節點", "子節點內容AAA"),                       new XElement("子節點", "子節點內容BBB")));               XComment com = new XComment("標准XML注釋");//XML注釋               root.Add(com);//加入XML注釋               XAttribute atu = new XAttribute("作者","李志偉");//XML屬性               root.Add(atu);//加入XML屬性               root.Save(@"..\..\XML\XML.xml");               Console.WriteLine("OK!");               Console.Read();           }       }   (3)查詢靜態的XML文檔   使用的XML文件內容:   <?xml version="1.0" encoding="utf-8"?>   <根節點>     <節點>       <子節點1>第一列01</子節點1>       <子節點2>第二列01</子節點2>     </節點>     <節點>       <子節點1>第一列02</子節點1>       <子節點2>第二列02</子節點2>     </節點>   </根節點>   程序代碼如下:       class Program       {           static void Main(string[] args)           {               XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;               var query = from element in xml.Descendants("子節點2") select element.Value;               foreach (string s in query)               {                   Console.WriteLine(s);               }               Console.Read();           }       }   (4)查詢動態的XML       class Program       {           static void Main(string[] args)           {               XDocument xml = XDocument.Load(@"http://geekswithblogs.net/evjen/Rss.aspx");               Console.WriteLine("已加載動態的XML");               var query = from element in xml.Descendants("title") select element.Value;               foreach (string s in query)               {                   Console.WriteLine(s);               }               Console.WriteLine("OK!");               Console.Read();           }   }   注意:本節只是介紹Linq to Xml的基本使用,不做深入研究,更詳細信息請查看本人的其它相關文檔。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved