• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • C#OOP CH08 可擴展標記語言XML

    標簽: c#

    C#OOP CH08 可擴展標記語言XML

    本章目標

    • 會編寫XML文件
    • 會讀取XML文件的元素
    • 會使用TreeView創建動態樹狀菜單

    1. XML 概述

    1.1 為什么學習 XML

    XML : 解決不同語言,不同平臺,不同操作系統之間的數據交互問題。

    1.2 什么是 XML

    什么是XML(eXtensible Markup Language):

    指可擴展標記語言,是獨立于軟件和硬件的信息傳輸工具,應用于 web 開發的許多方面,常用于簡化數據的存儲和共享。

    1.3 XML文檔格式的特點

    1. XML中每對標記通常被稱為節點,他們成對出現而且必須成對出現,用來描述
      這個節點存儲的內容,在節點中存儲該節點的信息。
    2. XML中用于描述數據的各個節點可以自由擴展。
    3. XML中的節點嚴格區分大小寫。

    1.4 XML文檔格式的要求

    1. 確定且唯一的根元素
    2. 開始標簽和結束標簽匹配
    3. 元素標簽必須正確嵌套
    4. 屬性值要用引號括起來
    5. 同一個元素的屬性不能重復

    1.5 XML語法要求

    元素:<標簽>文本內容</標簽>

    處理指令:<?xml version="1.0"?>

    注釋: <!-- 這個一個XML注釋 -->

    屬性:<salary currency="US$">2500</salary>

    1.6 XML跟HTML 的區別

    總的而言,可以概括為:XML 被設計用來傳輸和存儲數據。跨平臺、跨應用程序。即使不兼容的系統,也可以訪問XML文件,因為XML中是文本信息。

    HTML 被設計用來顯示數據。

    (一)、語法要求不同:

    1. 在HTML中不區分大小寫,在XML中嚴格區分。
    2. 在HTML中,有時不嚴格,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,
      那么你可以省略</p>或者</li>之類的結束標記。在XML中,是嚴格的樹狀結構,
      絕對不能省略掉結束標記。
    3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個/ 字符作為結尾。
      這樣分析器就知道不用查找結束標記了。
    4. 在XML中,屬性值必須封裝在引號中。在HTML中,引號是可用可不用的。
    5. 在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。
    6. 在XML文檔中,空白部分不會被解析器自動刪除;但是HTML是過濾掉空格的。

    (二)、標記不同:

    1. HTML使用固有的標記;而XML沒有固有的標記。
    2. HTML標簽是預定義的;XML標簽是免費的、自定義的、可擴展的。

    (三)、作用不同:

    1. HTML是用來顯示數據的;XML是用來描述數據、存放數據的,所以可以作為持久化的介質!
      HTML將數據和顯示結合在一起,在頁面中把這數據顯示出來;XML則將數據和顯示分開。
      XML被設計用來描述數據,其焦點是數據的內容。HTML被設計用來顯示數據,其焦點是數據的外觀。
    2. XML不是HTML的替代品,XML和HTML是兩種不同用途的語言。 XML 不是要替換 HTML;
      實際上XML 可以視作對 HTML 的補充。XML 和HTML 的目標不同.HTML 的設計目標
      是顯示數據并集中于數據外觀,而XML的設計目標是描述數據并集中于數據的內容。

    2. 操作XML文件的方法

    2.1 使用C#的方式創建XML文件

    1. 導入System.Xml命名空間

      using System.Xml;
      
    2. 創建XmlDocument對象

      XmlDocument doc = new XmlDocument();
      
    3. 創建第一行的描述信息 并添加到文檔中

      XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
      doc.AppendChild(dec);
      
    4. 給文檔添加根節點 并將根節點添加文檔對象

      XmlElement engineer = doc.CreateElement("Engineer");
      doc.AppendChild(engineer);
      //為student添加子元素
      XmlElement id = doc.CreateElement("ID");
      id.InnerText = "1002";
      engineer.AppendChild(id);
      
    5. 保存文件

      doc.Save("Engineer.xml");
      

    2.2 使用C#的方式讀取XML文件

    1. 導入System.Xml命名空間

      using System.Xml;
      
    2. 創建XmlDocument對象

      XmlDocument doc = new XmlDocument();
      
    3. 加載指定的XML文件

      doc.Load("Engineer.xml");//注意此處方法別調用錯了
      
    4. 獲取根節點

      XmlElement root = doc.DocumentElement;
      
    5. 遍歷子節點獲取值(或者根節點[“節點名”].ChildNodes)

      foreach (XmlElement item in root.ChildNodes)
      {
          Console.WriteLine(item.Name + "\t" + item.InnerText);
      }
      

    2.3 XmlNode與XmlElement的區別如下

    XmlNode類表示xml文檔中的單個節點,其命名空間為:System.Xml。XmlNode的三個最主要的子類包括:XmlDocument、XmlDataDocument及XmlDocumentFragment。

    XmlElement繼承自XmlLinkedNode又繼承自XmlNode類,由此可知XmlElement是XmlNode的子類。

    XmlElement是特殊的XmlNode類,Xml節點有多種類型:屬性節點、注釋節點、文本節點、元素節點等。

    也就是XmlNode是這多種節點的統稱。但是XmlElement專門指的就是元素節點。

    XmlElement是實現類,可以直接實例化,而XmlNode是抽象類。

    XmlElement擁有眾多對Attribute的操作方法,可以方便的對其屬性進行讀寫操作。

    2.4 解析所有的電視頻道

    需求說明

    解析FullChannels.xml文件,輸出頻道類型、頻道名稱和頻道節目單本地路徑

    FullChannels.xml文件內容如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <TVChannels>
    	<Channel>
    		<channelType>TypeA</channelType> <!--頻道類型-->
    		<tvChannel>北京電視臺</tvChannel> <!--頻道名稱-->
    		<path>files/北京電視臺.xml</path>  <!--頻道對應XML文件的本地路徑-->
    	</Channel>
    	<Channel>
    		<channelType>TypeB</channelType>
    		<tvChannel>鳳凰衛視</tvChannel>
    		<path>files/鳳凰衛視.xml</path>
    	</Channel>
    </TVChannels>
    

    使用C#的方式解析如下:

    XmlDocument doc = new XmlDocument();
    // 加載文件 注意路徑寫正確
    doc.Load(@"files/FullChannels.xml");
    // 獲取根節點
    XmlElement root = doc.DocumentElement;
    // 遍歷子節點取值
    foreach (XmlElement ele in root.ChildNodes)
    {
        Console.WriteLine(ele["channelType"].InnerText
                        +"\t"+ele["tvChannel"].InnerText+"\t"+ele["path"].InnerText);
    }
    

    效果如圖所示:
    在這里插入圖片描述

    2.5 解析頻道節目單

    需求說明

    分別解析TypeA類型及TypeB類型的頻道節目單

    Ø 北京電視臺節目單格式為TypeA類型,效果如圖所示:
    在這里插入圖片描述

    Ø 鳳凰衛視電視臺節目單格式為TypeB類型:
    在這里插入圖片描述

    實現思路

    1. 分析XML節點之間的關系
    2. 創建類ChannelManager,編寫方法封裝電視頻道信息解析
    3. 編寫抽象類ChannelBase存儲頻道基本信息,定義抽象屬性ProgramList解析頻道節目單信息
    4. 編寫TypeAChannel以及TypeBChannel類繼承ChannelBase類,重寫其ProgramList方法,分別完成TypeA類型以及TypeB類型的頻道節目單信息解析

    代碼如下

    1. 編寫TVProgram.cs,用來封裝電視節目信息,代碼如下:

      /// <summary>
      ///  電視節目信息類
      /// </summary>
      public class TVProgram
      {
          /// <summary>
          ///  節目名稱
          /// </summary>
          public string Name { get; set; }
          /// <summary>
          ///  節目時段
          /// </summary>
          public string Median { get; set; }
          /// <summary>
          ///  節目播出時間
          /// </summary>
          public DateTime PlayTime { get; set; }
          /// <summary>
          /// 視頻路徑
          /// </summary>
          public string Path { get; set; }
      	
         	//省略無參以及有參構造
      }    
      
    2. 編寫頻道基類ChannelBase.cs, 代碼如下:

      /// <summary>
      ///  所有頻道的基類 用來解析FullChannels.xml文件中的節點
      /// </summary>
      public class ChannelBase
      {
          /// <summary>
          ///  頻道名稱
          /// </summary>
          public string ChannelName { get; set; }
          /// <summary>
          ///  頻道類型
          /// </summary>
          public string ChannelType { get; set; }
          /// <summary>
          /// 頻道對應XML文件的本地路徑
          /// </summary>
          public string Path { get; set; }
          //為所有子類創建頻道列表對象 以便子類復用
          protected List<TVProgram> programList = new List<TVProgram>();
          /// <summary>
          ///  創建一個虛擬屬性 ProgramList 用來被子類重寫
          /// </summary>
          public virtual List<TVProgram> ProgramList { get; }
      
          public ChannelBase(string channelName, string channelType, string path)
          {
              ChannelName = channelName;
              ChannelType = channelType;
              Path = path;
          }
      }
      
    3. 編寫北京電視臺類,繼承ChannelBase.cs,并且重寫屬性ProgramList,用來填充北京電視臺的頻道信息,代碼如下:

      public class TypeAChannel : ChannelBase
      {
      
          public TypeAChannel(string channelName, string channelType, string path) 
              : base(channelName,channelType,path)
          {
      
          }
          public override List<TVProgram> ProgramList
          {
              get
              {
      
                  try
                  {
                      this.programList.Clear();
                      //創建XmlDocument對象
                      XmlDocument doc = new XmlDocument();
                      //加載xml文件
                      doc.Load(this.Path);
                      //獲取根節點
                      XmlElement root = doc.DocumentElement;
                      //遍歷子節點
                      foreach (XmlElement ele in root["tvProgramTable"].ChildNodes)
                      {
                          TVProgram tv = new TVProgram(ele["programName"].InnerText, ele["meridien"].InnerText,
                                                       Convert.ToDateTime(ele["playTime"].InnerText), ele["path"].InnerText);
                          this.programList.Add(tv);
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("解析北京電視臺xml文件異常,異常是:" + ex.ToString());
                  }
                  return this.programList;
              }
          }
      
    4. 編寫鳳凰衛視類,繼承ChannelBase.cs,并且重寫屬性ProgramList,用來填充鳳凰衛視的頻道信息,代碼如下:

      /// <summary>
      ///  鳳凰衛視
      /// </summary>
      public class TypeBChannel : ChannelBase
      {
          public TypeBChannel(string channelName, string channelType, string path) 
              : base(channelName,channelType,path)
          {
      
          }
          public override List<TVProgram> ProgramList
          {
              get
              {
                  try
                  {
                      this.programList.Clear();
                      //創建XmlDocument對象
                      XmlDocument doc = new XmlDocument();
                      //加載xml文件
                      doc.Load(this.Path);
                      //獲取根節點
                      XmlElement root = doc.DocumentElement;
                      //遍歷子節點
                      foreach (XmlElement ele in root["ProgramList"].ChildNodes)
                      {
                          TVProgram tv = new TVProgram(ele["name"].InnerText, null,
                                                       Convert.ToDateTime(ele["playTime"].InnerText), ele["path"].InnerText);
                          this.programList.Add(tv);
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("解析鳳凰衛視xml文件異常,異常是:" + ex.ToString());
                  }
                  return this.programList;
              }
          }
      }
      
    5. 創建類ChannelManager.cs,編寫方法封裝電視頻道信息解析:

      /// <summary>
      ///  頻道管理類 主要是給頻道填充數據
      /// </summary>
      public class ChannelManager
      {
          private string path = @"files/FullChannels.xml";
          private Dictionary<string, ChannelBase> fullChannels = new Dictionary<string, ChannelBase>();
          public Dictionary<string, ChannelBase> FullChannels
          {
              get
              {
                  try
                  {
                      this.fullChannels.Clear();
                      XmlDocument doc = new XmlDocument();
                      doc.Load(this.path);
                      XmlElement root = doc.DocumentElement;
                      foreach (XmlElement ele in root.ChildNodes)
                      {
                          ChannelBase channel = CreateChannelBase(ele["channelType"].InnerText,
                                                                  ele["tvChannel"].InnerText, ele["path"].InnerText);
                          this.fullChannels.Add(channel.ChannelName, channel);
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show("解析頻道Xml文件異常,異常信息是:" + ex.ToString());
                  }
                  return fullChannels;
              }
          }
          private ChannelBase CreateChannelBase(string type, string name, string path)
          {
              ChannelBase channel = null;
              switch (type)
              {
                  case "TypeA":
                      channel = new TypeAChannel(name, type, path);
                      break;
                  case "TypeB":
                      channel = new TypeBChannel(name, type, path);
                      break;
                  default:
                      break;
              }
              return channel;
          }
      }
      

    3. TreeView顯示數據

    TreeView控件的使用如下:

    3.1TreeView 控件重要屬性和事件

    在這里插入圖片描述

    3.2 節點對象(TreeNode)的屬性

    在這里插入圖片描述

    3.3 TreeView動態添加節點

    在這里插入圖片描述

    3.4 TreeView刪除節點

    在這里插入圖片描述

    4. 綜合案例—網絡電視精靈

    4.1 問題:

    開發一個小型工具軟件—網絡電視精靈

    • 節目單更新與解析
    • 展示節目單
    • 節目播放
    • 偏好定制與持久化
      在這里插入圖片描述

    4.2 顯示電視頻道

    需求說明

    顯示網絡電視精靈樹狀菜單中“我的電視臺”及“所有電視臺”下的所有頻道列表
    在這里插入圖片描述

    完善網絡電視精靈,通過TreeView加載頻道信息,代碼如下:

    ChannelManager channelManager = new ChannelManager();
    //加載頻道
    public void InitialTreeView()
    {
        TreeNode rootNode = new TreeNode("我的電視臺", 0, 1);
        this.tvChannel.Nodes.Add(rootNode);
        rootNode = new TreeNode("所有電視臺", 0, 1);    
        foreach (ChannelBase channel in channelManager.FullChannels.Values)
        {
            TreeNode temp = new TreeNode(channel.ChannelName, 0, 1);
            //給每個節點的tag綁定一個channelBase 以便點擊時 能夠綁定dgv數據
            temp.Tag = channel;
            temp.Name = channel.ChannelName;
            rootNode.Nodes.Add(temp);
        }
        this.tvChannel.Nodes.Add(rootNode);
        //展開所有的節點
        this.tvChannel.ExpandAll();
    }
    

    4.3 定制頻道

    需求說明

    • 定制我的頻道:右鍵選擇頻道,單擊“添加”,添加到“我的電視臺”
    • “所有電視臺”節點只允許“添加”操作在這里插入圖片描述
    • “我的電視臺”節點只允許“刪除”操作在這里插入圖片描述

    實現思路

    • 右鍵菜單“添加”事件,代碼如下:

      //加入我的電視臺
      private void tsmiAdd_Click(object sender, EventArgs e)
      {
          TreeNode node = this.tvChannel.SelectedNode;
          if (node.Level == 0) return;
          if (this.tvChannel.Nodes[0].Nodes.ContainsKey(node.Name))
          {
              MessageBox.Show("該電視臺已經收藏過了,請選擇別的電視臺");
              return;
          }
          //加入我的電視臺
          node = node.Clone() as TreeNode;
          this.tvChannel.Nodes[0].Nodes.Add(node);
      }
      
    • 右鍵菜單“刪除”事件,代碼如下:

      //刪除電視臺
      private void tsmiDel_Click(object sender, EventArgs e)
      {
          TreeNode node = this.tvChannel.SelectedNode;
          if (node.Level == 0) return;
          DialogResult result = MessageBox.Show("確定要刪除該電視臺嗎?", "提示", MessageBoxButtons.YesNo);
          if (result == DialogResult.No) return;
          node.Remove();
      }
      
    • 編寫TreeView控件MouseClick事件,控制右鍵菜單顯示,代碼如下:

       //控制右鍵點擊操作
      private void tvChannel_MouseClick(object sender, MouseEventArgs e)
      {
          if (this.tvChannel.SelectedNode.Level == 0)
          {
              this.cmsRight.Items[0].Visible = false;
              this.cmsRight.Items[1].Visible = false;
              return;
          }
          if (this.tvChannel.SelectedNode.Parent.Text == this.tvChannel.Nodes[0].Text)
          {
              this.cmsRight.Items[0].Visible = false;
              this.cmsRight.Items[1].Visible = true;
          }
          if (this.tvChannel.SelectedNode.Parent.Text == this.tvChannel.Nodes[1].Text)
          {
              this.cmsRight.Items[1].Visible = false;
              this.cmsRight.Items[0].Visible = true;
          }
      }
      

    4.4 顯示節目單

    需求說明

    • 單擊電視臺頻道節點,DataGridView顯示頻道對應節目單:在這里插入圖片描述

    實現思路

    • 編寫TreeView 節點選中(AfterSelect)改變事件,代碼如下:

      //節點選中改變事件
      private void tvChannel_AfterSelect(object sender, TreeViewEventArgs e)
      {
          //獲取用戶選中的節點
          TreeNode node = this.tvChannel.SelectedNode;
          //判斷節點
          if (node.Level == 0) return;
          //獲取節點中綁定的Tag值 從而可以獲取到channelbase
          ChannelBase channelBase = node.Tag as ChannelBase;
          //綁定dgv
          this.dgvList.AutoGenerateColumns = false;
          this.dgvList.DataSource = new BindingList<TVProgram>(channelBase.ProgramList);
      }
      
    版權聲明:本文為weixin_40154786原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_40154786/article/details/110851379

    智能推薦

    XML(可擴展標記語言)

    簡介 XML(可擴展標記語言)是一個標記語言定義了一系列的規則對于編碼文件以一種機器和人類都可讀的方式。W3C的XML 1.0規范和其他幾個相關規范(都是免費開放標準)定義了XML. XML的設計目標強度簡潔,普遍,互聯網可用。它是一個文本的數據格式通過Unicode為不同的人類語言提供強大的支持。雖然XML的設計關注在文檔上,這個語言廣泛應用在表現任意的數據結構就像用于網絡服務中的一樣。 存在一...

    XMl可擴展標記語言

    1.什么是XML? XML指可擴展標記語言它是一種很像HTML的標記語言,它的設計宗旨是傳輸數據,而不是顯示數據。HTML中的元素是固定的,而XML標簽沒有被預定義,可以由用戶來進行自定義,XML被設計為具有自我描述性,且跨平臺。 2.XML文檔結構 XML的擴展名為.xml,它由兩大部分組成,頭部的聲明和下面的主體描述信息。 聲明一般處于XML文件的第一行,用來標注XML的配置屬性。 versi...

    ch08——8.3.4使用參數化模型投影點云

    ch08——8.3.4使用參數化模型投影點云 1.將點投影到一個參數化模型上(平面或球體)。參數化模型通過一組參數來設定。 2.代碼 3.顯示...

    ch08——8.3.6PCL使用ConditionalRemoval或RadiusOutlierRemoval移除離群點

    ch08——8.3.6使用ConditionalRemoval或RadiusOutlierRemoval移除離群點 1.使用一個ConditionalRemoval濾波器,可以一次刪除滿足對輸入的點云設定一個或多個條件指標的所有數據點。使用一個RadiusOutlierRemoval濾波器,可以刪除在輸入的點云一定范圍內沒有至少達到足夠多近鄰的所有數據點。 2.代碼...

    ch08——8.3.3在PCL中使用StatisticalOutlierRemoval濾波器移除離群點

    ch08——8.3.3在PCL中使用StatisticalOutlierRemoval濾波器移除離群點 1.使用統計分析技術,從一個點云數據集中移除測量噪聲點。對每一個點的鄰域進行一個統計分析,并修剪掉那些不符合一定標準的點。我們的稀疏離群點移除方法基于在輸入數據中對點到臨近點的距離分布的計算。對每個點,我們計算它到它的所有的臨近點的平均距離。假設得到的結果是一個高斯分布,...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡