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 實體引用(例如,#)。
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);