XML定義:
XML(extensible Markup Language)即可扩展标记语言。
XML舉例:
<Books>
<book>
<title>
Beginning Visual C#
</title>
<author>
Karli Watson
</author>
<code>
7582
</code>
</book>
<book Pages="1000">
<!--This book is the book you are reading-->
<title>Beginning Visual C# 3rd Edition</title>
<author>Karli Watson et al</author>
<code>123456789</code>
</book>
</Books>
XML主要結點類型:
根節點(文檔結點) |
元素 |
屬性 |
文本 |
註釋 |
結點類型在XML文件中對應如下:
XML操作的動作:
讀取 |
選擇 |
增加 |
刪除 |
修改 |
替換 |
Xml操作的主要流程為:
Xpath語言:
XPath是XML文檔的查詢語言。XML相關於數據庫,Xpath就是查詢數據的語言,即相當於SQL。詳細資料可參考(http://www.w3school.com.cn/xpath/index.asp)
Xpath常見的表達式如下:
表达式 |
描述 |
|
nodename |
选取此节点的所有子节点 |
|
/ |
从根节点选取 |
|
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
|
. |
选取当前节点 |
|
.. |
选取当前节点的父节点 |
|
* |
選擇任何節點 |
|
@ |
选取属性 |
|
@* |
選擇所有屬性 |
|
athor[2] |
按照索引選擇一個子節點,這裡選擇第二個author節點 |
|
text() |
選擇當前節點中所有文本節點 |
|
author/text() |
選擇當前節點的一個或多個子節點 |
|
//title |
在文檔中選擇帶有特定名稱的所有節點,在這裡是所有的title節點 |
|
//@author |
选取所有名为author的属性。 |
|
//book/title |
在文檔中選擇帶有特定和特定父節點的所有節點,在這裡父節點名稱是Book,節點名稱是title |
|
//book[author=’Jacob’] |
選擇滿足條件的節點,這是authoer節點為’Jacob’的值 |
|
//book[@pages=’10’] |
選擇屬性值滿足條件的節點,這裡是page屬性為10的值 |
|
//book/title | //book/ author |
选取所有 book 元素的 tilte 和 author元素。 |
|
例一、實現下圖功能。
using System.IO;
namespace XmlOperate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//得到XML內容按鈕事件
btnGet.Click += new EventHandler(btnGet_Click);
//創建Node按鈕事件
btnCreateNode.Click += new EventHandler(btnCreateNode_Click);
//刪除節點按鈕事件
btnDeleteNode.Click += new EventHandler(btnDeleteNode_Click);
}
/// <summary>
/// 得到XML內容按鈕事件方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnGet_Click(object sender, EventArgs e)
{
lbXmlValue.Items.Clear();
if (File.Exists(@"D:\BegVCSharp\book.xml"))
{
//加載XML文件
XmlDocument xdDocument = new XmlDocument();
xdDocument.Load(@"D:\BegVCSharp\book.xml");
//得到主節點
XmlElement xeRoot = xdDocument.DocumentElement;
if (xeRoot!=null)
{
XmlNode xnNodeRoot = (XmlNode)xeRoot;
RecurseXmlDocument(xnNodeRoot, 0);
}
}
}
/// <summary>
/// 讀取XML
/// </summary>
/// <param name="aXnNode">節點</param>
/// <param name="aIndent">縮進大小</param>
private void RecurseXmlDocument(XmlNode aXnNode,int aIndent)
{
//判斷結點中是否有內容
if (aXnNode == null)
{
return;
}
//節點是元素時
if (aXnNode is XmlElement)
{
//顯示根元素的名稱
lbXmlValue.Items.Add(aXnNode.Name.PadLeft(aXnNode.Name.Length + aIndent));
if (aXnNode.Attributes!=null)
{
//得到屬性
foreach (XmlAttribute xaAttribute in aXnNode.Attributes)
{
string sText = "";
sText = xaAttribute.Name;
lbXmlValue.Items.Add(sText.PadLeft(sText.Length + aIndent+2));
sText = xaAttribute.Value;
lbXmlValue.Items.Add(sText.PadLeft(sText.Length + aIndent+4));
}
}
//根元素中是否有子元素
if (aXnNode.HasChildNodes)
{
//有子節點,遍歷子節點
RecurseXmlDocument(aXnNode.FirstChild, aIndent+2);
}
//判斷下個節點是為空
if (aXnNode.NextSibling != null)
{
RecurseXmlDocument(aXnNode.NextSibling, aIndent);
}
}
else if (aXnNode is XmlText)
{
//顯示節點中的內容
string sText = ((XmlText)aXnNode).Value;
lbXmlValue.Items.Add(sText.PadLeft(sText.Length + aIndent));
}
else if (aXnNode is XmlComment)
{
string sText = aXnNode.Value;
lbXmlValue.Items.Add(sText.PadLeft(sText.Length + aIndent));
//如果不加下邊的遍歷,資料只會得出備註中的內容,不會得出子節點內容
if (aXnNode.HasChildNodes)
{
//有子節點,遍歷子節點
RecurseXmlDocument(aXnNode.FirstChild, aIndent + 2);
}
if (aXnNode.NextSibling != null)
{
RecurseXmlDocument(aXnNode.NextSibling, aIndent);
}
}
}
/// <summary>
/// 創建Node按鈕事件方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnCreateNode_Click(object sender, EventArgs e)
{
//加載XML文件
XmlDocument xdDocument = new XmlDocument();
xdDocument.Load(@"D:\BegVCSharp\book.xml");
//得到主節點
XmlElement xeRoot = xdDocument.DocumentElement;
//創建節點
XmlElement newBook = xdDocument.CreateElement("book");
XmlElement newTitle = xdDocument.CreateElement("title");
XmlElement newAuthor = xdDocument.CreateElement("author");
XmlElement newCode = xdDocument.CreateElement("code");
//創建屬性
XmlAttribute xaNewAttribute = xdDocument.CreateAttribute("Pages");
xaNewAttribute.Value = "1000";
XmlText title = xdDocument.CreateTextNode("Beginning Visual C# 3rd Edition");
XmlText author = xdDocument.CreateTextNode("Karli Watson et al");
XmlText code = xdDocument.CreateTextNode("123456789");
//創建備註
XmlComment comment = xdDocument.CreateComment("This book is the book you are reading");
//元素插入XML樹中
newBook.AppendChild(comment);
newBook.Attributes.Append(xaNewAttribute);
newBook.AppendChild(newTitle);
newBook.AppendChild(newAuthor);
newBook.AppendChild(newCode);
newTitle.AppendChild(title);
newAuthor.AppendChild(author);
newCode.AppendChild(code);
//插入某節點後邊
xeRoot.InsertAfter(newBook, xeRoot.FirstChild);
//保存結果
xdDocument.Save(@"D:\BegVCSharp\book.xml");
}
/// <summary>
/// 刪除節點按鈕事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnDeleteNode_Click(object sender, EventArgs e)
{
//加載XML文件
XmlDocument xdDocument = new XmlDocument();
xdDocument.Load(@"D:\BegVCSharp\book.xml");
//得到主節點
XmlElement xeRoot = xdDocument.DocumentElement;
if (xeRoot.HasChildNodes)
{
//得到最後一個節點
XmlNode xnBook = xeRoot.LastChild;
//刪除最後一個結點
xeRoot.RemoveChild(xnBook);
//保存結果
xdDocument.Save(@"D:\BegVCSharp\book.xml");
}
}
}
}
例二、用Xpath執行相關查詢
namespace XmlIoManage
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string sXmlPath = @"D:\BegVCSharp\XPathQuery.xml";
XmlDocument xdDocument = new XmlDocument();
xdDocument.Load(sXmlPath);
XmlNode xnNode = xdDocument.DocumentElement;
GetXmlListAttribute(xnNode, "//@pages");
GetXmlElementList(xnNode, "//book");
}
/// <summary>
/// 得到指定結點的Text值
/// </summary>
/// <param name="aXnNode"></param>
/// <param name="asAttributeFilter"></param>
private void GetXmlElementList(XmlNode aXnNode, string asAttributeFilter)
{
List<string> lElementTextlist = new List<string>();
if (aXnNode == null)
{
return;
}
XmlNodeList xnlNodeList = aXnNode.SelectNodes(asAttributeFilter);
lElementTextlist = ReadXmlElementText(xnlNodeList);
}
/// <summary>
/// 讀取節點Text值
/// </summary>
/// <param name="aXnlNodeList"></param>
/// <returns></returns>
private List<string> ReadXmlElementText(XmlNodeList aXnlNodeList)
{
List<string> lElementTextlist = new List<string>();
if (aXnlNodeList==null)
{
return lElementTextlist;
}
foreach (XmlNode xnNode in aXnlNodeList)
{
string sText = RecurseXmlDocument(xnNode);
lElementTextlist.Add(sText);
}
return lElementTextlist;
}
string sNodeInderText = "";
/// <summary>
/// 返回第一個Text值
/// </summary>
/// <param name="aXnNode"></param>
/// <returns></returns>
private string RecurseXmlDocument(XmlNode aXnNode)
{
if (aXnNode == null)
{
return "";
}
if (aXnNode is XmlElement)
{
if (aXnNode.HasChildNodes)
{
RecurseXmlDocument(aXnNode.FirstChild);
}
}
else if (aXnNode is XmlText)
{
sNodeInderText = ((XmlText)aXnNode).Value;
}
sNodeInderText+=sNodeInderText.Trim();
return sNodeInderText;
}
/// <summary>
/// 得到所有指定屬性的值
/// </summary>
/// <param name="aXnNode">aXnNode</param>
/// <param name="asAttributeFilter">屬性過慮值</param>
private void GetXmlListAttribute(XmlNode aXnNode, string asAttributeFilter)
{
//存放得到屬性列表
List<string> lAttributeList = new List<string>();
if (aXnNode == null)
{
return;
}
XmlNodeList xnlNodeList = aXnNode.SelectNodes(asAttributeFilter);
lAttributeList = ReadXmlAttributeList(xnlNodeList);
}
/// <summary>
/// 得到屬性列表
/// </summary>
/// <param name="aXaNodeList">XmlNodeList</param>
/// <returns>得到的屬性列表</returns>
private List<string> ReadXmlAttributeList(XmlNodeList aXaNodeList)
{
//存放得到屬性列表
List<string> lAttributeList = new List<string>();
if (aXaNodeList == null)
{
return lAttributeList;
}
foreach (XmlNode xnNode in aXaNodeList)
{
if (xnNode is XmlAttribute)
{
XmlAttribute xaAttribute = (XmlAttribute)xnNode;
lAttributeList.Add(xaAttribute.Value);
}
}
return lAttributeList;
}
/// <summary>
/// 選擇單個結點屬性
/// </summary>
/// <param name="aXnNode">被查詢的Xml</param>
/// <param name="asAttributeFilter">Xpth條件</param>
private void GetXmlSingleAttribute(XmlNode aXnNode, string asAttributeFilter)
{
if (aXnNode==null)
{
return;
}
XmlNode xnSelectNode = aXnNode.SelectSingleNode(asAttributeFilter);
string sResult = ReadXmlSingleAttribute(xnSelectNode);
}
/// <summary>
/// 讀取XML單點的屬性方法
/// </summary>
/// <param name="aXnNode">XmlNode</param>
/// <returns>得到的屬性值</returns>
private string ReadXmlSingleAttribute(XmlNode aXnNode)
{
string sRetrunValue = "";
if (aXnNode==null)
{
return sRetrunValue;
}
if (aXnNode is XmlElement)
{
if (aXnNode.Attributes!=null)
{
foreach (XmlAttribute xaAttribute in aXnNode.Attributes)
{
sRetrunValue = xaAttribute.Value;
}
}
}
return sRetrunValue;
}
}
}