在昨天的文章中,講述了開發音樂播放器的第一步之播放類的構建,今天的文章就開始第二步--Xml讀取類的構建。
一個音樂播放器是要有列表文件的,這里就用Xml文件作為列表文件。
為了讀取音樂列表更方便,我們將這方面的操作封裝成一個專門的類,名曰MusicListsReaders類。
在構建類之前,先講一些關於Xml的基礎知識。
一是XmlDocument類,它表示一個XML 文檔。可以用其中的Load方法加載一個Xml文件,在進行各種操作。可以參考msdn上的文章http://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument.aspx;
二是XmlNode類,它表示 XML 文檔中的單個節點。其中的重要屬性是InnerText(表示節點中的文本)和ChildNodes屬性(表示節點下的所有子節點),重要方法則有SelectNodes(獲取指定的節點集合[獲取多個]和SelectSingleNode(獲取指定的節點[獲取第一個])。
三是XmlElement類,它表示一個元素。除包含以上介紹的XmlNode具有的重要屬性和重要方法外,還有一個重要的方法GetAttribute,它返回返回具有指定名稱的特性的值。具體是什么意思呢,例如這里有一個Xml文件:
<Root> <Numbers> <Number id="1"></Number> </Numbers> </Root>
這是一個最簡單的Xml文件,其中節點 Root 叫做根節點,它里面的節點叫做子節點,下層的是上層的子節點,其中的id="1",就是具有指定名稱的特征的值。
以上只介紹了我們在下邊會用到的方法及屬性,並不包含全部,具體請MSDN。
新建一個類文件,在類的開頭聲明幾個私有變量:
private string url; //表示列表(Xml)文件路徑
private XmlDocument dom; //表示Xml文檔
private bool isError=false; //表示是否有錯誤
private string errorText=""; //表示錯誤信息
現在開始編寫構造函數,和上一個類一樣,都是有兩個構造函數,方便用不同的方式傳入列表(xml)文件的路徑:
/// <summary> /// 構造函數 /// </summary> /// <param name="filename">音樂列表文件名</param> public MusicListsReader(string filename) { dom = new XmlDocument(); LoadXml(filename); } /// <summary> /// 構造函數重載+1 /// </summary> public MusicListsReader() { dom = new XmlDocument(); }
以下是LoadXml的方法實現:
/// <summary> /// 載入指定的音樂列表xml文件 /// </summary> /// <param name="filename">音樂列表文件名</param> public void LoadXml(string filename) { if (url == "") { SetErrorInformation("親,列表讀取錯誤!"); } url = filename; dom.Load(url); }
這是SetErrorInformation和GetErrorInformation方法的實現:
/// <summary> /// 設置列表錯誤信息 /// </summary> /// <param name="errortext"></param> /// <returns></returns> public void SetErrorInformation(string errortext) { isError = true; errorText =errortext; }
/// <summary> /// 獲取列表錯誤信息 /// </summary> /// <returns></returns> public string GetErrorInformation() { if (isError == true) { return errorText; } else { return null; } }
再展示下其余的代碼,相信大家完全可以看明白:
/// <summary> /// 獲取文檔根節點 /// </summary> /// <returns></returns> private XmlElement GetXmlRootElement() { return dom.DocumentElement; } /// <summary> /// 獲取列表的名稱 /// </summary> public string GetXmlMusicListName() { XmlElement root=GetXmlRootElement(); return GetAttribute(root, "name"); } /// <summary> /// 獲取xml文件中所有的音樂子項 /// </summary> /// <returns></returns> public XmlNodeList GetXmlMusicItems() { XmlElement root= GetXmlRootElement();//獲取根節點 XmlNode rootn = XmlConverter(root);//轉換為XmlNode return rootn.SelectNodes("Music");//選定返回所有Music節點 } /// <summary> /// 獲取列表中的音樂總數 /// </summary> /// <returns></returns> public int GetXmlCount() { XmlElement xe= GetXmlRootElement(); return xe.ChildNodes.Count; } /// <summary> /// 獲取指定元素的值 /// </summary> /// <param name="xe"></param> /// <param name="attribute">XmlElement對象</param> /// <returns></returns> public string GetAttribute(XmlElement xe, string attribute) { return xe.GetAttribute(attribute);//返回該Attribute的值 } /// <summary> /// 獲取指定歌曲的url /// </summary> /// <param name="xe">XmlElement對象</param> /// <returns></returns> public string GetMusicUrl(XmlElement xe) { return GetAttribute(xe, "url"); } /// <summary> /// 獲取指定歌曲的歌手 /// </summary> /// <param name="xe">XmlElement對象</param> /// <returns></returns> public string GetMusicSinger(XmlElement xe) { return GetAttribute(xe, "singer"); } /// <summary> /// 獲取指定歌曲的名稱 /// </summary> /// <param name="xe">XmlElement對象</param> /// <returns></returns> public string GetMusicName(XmlElement xe) { return xe.InnerText; } /// <summary> /// 獲取指定音樂節點 /// </summary> /// <param name="index">序號</param> /// <returns>返回XmlNode對象</returns> private XmlNode GetXmlMusicItemByIndex(int index) { XmlNodeList xnl = GetXmlMusicItems(); return xnl.Item(index); } /// <summary> /// 獲取指定音樂節點的所有信息 /// </summary> /// <param name="index">序號</param> /// <returns>返回XmlListProduct對象</returns> public XmlListProduct GetXmlMusicItemInformation(int index) { XmlNode xn= GetXmlMusicItemByIndex(index); XmlElement xe = XmlConverter(xn); XmlListProduct xlp= new XmlListProduct(GetMusicUrl(xe),GetMusicName(xe), GetMusicSinger(xe)); return xlp; } /// <summary> /// 將XmlElement轉換為XmlNode /// </summary> /// <param name="xe">要轉換的XmlElement</param> /// <returns></returns> private XmlNode XmlConverter(XmlElement xe) { return (XmlNode)xe; } /// <summary> /// 將XmlNode轉換為XmlElement /// </summary> /// <param name="xn">要轉換的XmlNode</param> /// <returns></returns> private XmlElement XmlConverter(XmlNode xn) { return (XmlElement)xn; } }
由於XmlNode和XmlElement經常需要轉換,就在上邊的代碼中寫了個重載函數,方便轉換。
以上只是對代碼的封裝,便於操作,涉及到的知識並是不很多。至此今天的文章到此結束。
在明天的文章中將會構建數據讀取類,為數據綁定做基礎的。
希望大家拍磚別拍的太狠哈。