C# 簡單的XML讀取修改寫入

來源:互聯網
上載者:User
  

XML概念
Root XML根節點,只能且必須有一個(以上為LinkLibrary)
Element 節點元素(如Link)
Attribute 節點屬性(如Cat, Url, Desc)
Content 內容(非空白文本、CDATA、Element、EndElement、EntityReference 或 EndEntity)節點

System.Xml空間
以下類適合快速流式讀寫XML檔案(註:DOM適合隨機讀寫)
XmlReader, XmlWriter,
XmlTextReader, XmlTextWriter
XmlValidatingReader, XmlValidatingWriter 添加了DTD和模式驗證,因此提供了資料的有效性驗證
XmlNodeReader, XmlNodeWriter 把XmlNode作為其源

節點類型(public enum XmlNodeType)
XmlDeclaration XML 聲明(例如,<?xml version="1.0"?>)。
Attribute 屬性(例如,id="123")。
CDATA CDATA 節(例如,<![CDATA[my escaped text]]>)。
Comment 注釋(例如,<!-- my comment -->)
Document 作為文檔樹的根的文檔對象提供對整個 XML 文檔的訪問。
DocumentFragment 文檔片段。
DocumentType 由以下標記指示的文件類型聲明(例如,<!DOCTYPE...>)。
Element 元素(例如,<item>)。
EndElement 末尾元素標記(例如,</item>)。
Entity 實體聲明(例如,<!ENTITY...>)。
EndEntity 由於調用 ResolveEntity 而使 XmlReader 到達實體替換的末尾時返回。
EntityReference 實體引用(例如,&num;)。
None 如果未調用 Read 方法,則由 XmlReader 返回。
Notation 文件類型聲明中的標記法(例如,<!NOTATION...>)。
ProcessingInstruction 處理指示(例如,<?pi test?>)。
SignificantWhitespace 混合內容模型中標記間的空白或 xml:space="preserve" 範圍內的空白。
Text 節點的常值內容。
Whitespace 標記間的空白。


 ------------------------------------------------------------------------
使用XmlTextWriter快速寫入
------------------------------------------------------------------------
開閉
XmlTextWriter writer = new XmlTextWriter(@"c:/mywriter.xml", null);
writer.Close();

起止XML文檔 (<?xml version="1.0"?>
writer.WriteStartDocument();
writer.EndDocument();

聲明XML格式
writer.Formatting = Formatting.Indented;
writer.Indentation = 縮排字元數
writer.IndentChar = 縮排字元
writer.QuoteChar = 單引號|雙引號

輸出注釋 (<!-- comment text -->)
writer.WriteComment("comment text");

輸出元素 (<Element>ElementVal</Element>)
writer.WriteElementString("Element", "ElementVal");
或者
writer.StartElement("Element");
writer.WriteString("ElementVal");
writer.EndElement();

輸出元素屬性 (<Element Property="PropertyVal">ElementVal</Element>)
writer.StartElement("Element");
writer.WriteAttributeString("Property", "PropertyVal");
writer.WriteString("ElementVal");
writer.EndElement();

輸出CDATA (<!CDATA>....</CDATA>
WriteCData("....")

輸出字元緩衝區文本
WriteChars(char[], startPos, length)

 

  已知有一個XML檔案(bookstore.xml)如下:

 

<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
</bookstore>


 
  1、往<bookstore>節點中插入一個<book>節點:

 

   XmlDocument xmlDoc=new XmlDocument();
   xmlDoc.Load("bookstore.xml");
   XmlNode root=xmlDoc.SelectSingleNode("bookstore");//尋找<bookstore>
   XmlElement xe1=xmlDoc.CreateElement("book");//建立一個<book>節點
   xe1.SetAttribute("genre","李贊紅");//設定該節點genre屬性
   xe1.SetAttribute("ISBN","2-3631-4");//設定該節點ISBN屬性
 
   XmlElement xesub1=xmlDoc.CreateElement("title");
   xesub1.InnerText="CS從入門到精通";//設定文本節點
   xe1.AppendChild(xesub1);//添加到<book>節點中
   XmlElement xesub2=xmlDoc.CreateElement("author");
   xesub2.InnerText="候捷";
   xe1.AppendChild(xesub2);
   XmlElement xesub3=xmlDoc.CreateElement("price");
   xesub3.InnerText="58.3";
   xe1.AppendChild(xesub3);
 
   root.AppendChild(xe1);//添加到<bookstore>節點中
   xmlDoc.Save("bookstore.xml");


  //================
  結果為:

 

<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book genre="李贊紅" ISBN="2-3631-4">
    <title>CS從入門到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </book>
</bookstore>


2、修改節點:將genre屬性值為“李贊紅“的節點的genre值改為“update李贊紅”,將該節點的子節點<author>的文本修改為“亞勝”。

 

    XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//擷取bookstore節點的所有子節點
   foreach(XmlNode xn in nodeList)//遍曆所有子節點
   {
    XmlElement xe=(XmlElement)xn;//將子節點類型轉換為XmlElement類型
    if(xe.GetAttribute("genre")=="李贊紅")//如果genre屬性值為“李贊紅”
    {
     xe.SetAttribute("genre","update李贊紅");//則修改該屬性為“update李贊紅”
 
     XmlNodeList nls=xe.ChildNodes;//繼續擷取xe子節點的所有子節點
     foreach(XmlNode xn1 in nls)//遍曆
     {
      XmlElement xe2=(XmlElement)xn1;//轉換類型
      if(xe2.Name=="author")//如果找到
      {
       xe2.InnerText="亞勝";//則修改
       break;//找到退出來就可以了
      }
     }
     break;
    }
   }
 
   xmlDoc.Save("bookstore.xml");//儲存。



  //=================

  最後結果為:

 

<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book genre="update李贊紅" ISBN="2-3631-4">
    <title>CS從入門到精通</title>
    <author>亞勝</author>
    <price>58.3</price>
  </book>
</bookstore>


 
  3、刪除 <book genre="fantasy" ISBN="2-3631-4">節點的genre屬性,刪除 <book genre="update李贊紅" ISBN="2-3631-4">節點。

 

XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
 
   foreach(XmlNode xn in xnl)
   {
    XmlElement xe=(XmlElement)xn;


   if(xe.GetAttribute("genre")=="fantasy")
    {
     xe.RemoveAttribute("genre");//刪除genre屬性
    }
    else if(xe.GetAttribute("genre")=="update李贊紅")
    {
     xe.RemoveAll();//刪除該節點的全部內容
    }
   }
   xmlDoc.Save("bookstore.xml");

  //====================
 
  最後結果為:

  <?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book>
  </book>
</bookstore>

 
  4、顯示所有資料。

 

 XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
 
   XmlNodeList xnl=xn.ChildNodes;
  
   foreach(XmlNode xnf in xnl)
   {
    XmlElement xe=(XmlElement)xnf;
    Console.WriteLine(xe.GetAttribute("genre"));//顯示內容值
    Console.WriteLine(xe.GetAttribute("ISBN"));
 
    XmlNodeList xnf1=xe.ChildNodes;
    foreach(XmlNode xn2 in xnf1)
    {
     Console.WriteLine(xn2.InnerText);//顯示子節點點文本
    }
   }

 

 

------------------------------------------------------------------------
寫常式
------------------------------------------------------------------------
[c-sharp] view plain copy print ? XmlTextWriter writer = new XmlTextWriter (filename, null);   //Use indenting for readability.   writer.Formatting = Formatting.Indented;   //xml聲明(Write the XML delcaration. )   writer.WriteStartDocument();   //預先處理指示(Write the ProcessingInstruction node.)   String PItext="type="text/xsl" href="book.xsl"";   writer.WriteProcessingInstruction("xml-stylesheet", PItext);   //文件類型(Write the DocumentType node.)   writer.WriteDocType("book", null , null, "<!ENTITY h "hardcover">");   //注釋(Write a Comment node.)   writer.WriteComment("sample XML");   //根項目(Write a root element.)   writer.WriteStartElement("book");   //屬性值(Write the genre attribute.)   writer.WriteAttributeString("genre", "novel");   //屬性值(Write the ISBN attribute.)   writer.WriteAttributeString("ISBN", "1-8630-014");   //Write the title.   writer.WriteElementString("title", "The Handmaid"s Tale");   //Write the style element.   writer.WriteStartElement("style");   writer.WriteEntityRef("h");   writer.WriteEndElement();    //文本元素節點(Write the price.)   writer.WriteElementString("price", "19.95");   //[CDATA]   writer.WriteCData("Prices 15% off!!");   //Write the close tag for the root element.   writer.WriteEndElement();   writer.WriteEndDocument();   //Write the XML to file and close the writer.   writer.Flush();   writer.Close();    //Load the file into an XmlDocument to ensure well formed XML.   XmlDocument doc = new XmlDocument();   //Preserve white space for readability.   doc.PreserveWhitespace = true;   //Load the file.   doc.Load(filename);    //Display the XML content to the console.   Console.Write(doc.InnerXml);   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.