XML定義:

    XML(extensible Markup Language)即可扩展标记语言。

 

XML舉例:


<?xml version="1.0" encoding="utf-8"?>

<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操作


 

 

XML操作的動作:

 



讀取



選擇



增加



刪除



修改



替換



 

 

Xml操作的主要流程為:

XML學習總結_xml文件_02

 

Xpath語言:

        XPath是XML文檔的查詢語言。XML相關於數據庫,Xpath就是查詢數據的語言,即相當於SQL。 

 

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元素。



 



 

 例一、實現下圖功能。



XML學習總結_子节点_03


 

 

 


using System.Xml;

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執行相關查詢


using System.Xml;


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;

        }

    }

}