天天看點

C#實用教程-操作xml檔案C#實用教程-操作xml檔案

@TOC

C#實用教程-操作xml檔案

引言:什麼是xml檔案

可擴充标記語言,标準通用标記語言的子集,簡稱XML。是一種用于标記電子檔案使其具有結構性的标記語言。

在電子計算機中,标記指計算機所能了解的資訊符号,通過此種标記,計算機之間可以處理包含各種的資訊比如文章等。它可以用來标記資料、定義資料類型,是一種允許使用者對自己的标記語言進行定義的源語言。 它非常适合網際網路傳輸,提供統一的方法來描述和交換獨立于應用程式或供應商的結構化資料。是Internet環境中跨平台的、依賴于内容的技術,也是當今處理分布式結構資訊的有效工具。早在1998年,W3C就釋出了XML1.0規範,使用它來簡化Internet的文檔資訊傳輸。

中文名 可擴充标記語言
外文名 Extensible Markup Language
類 型 标記語言
外語縮寫 XML(也做檔案擴充名)
中文縮寫 可擴标言
其他稱呼 可擴充置智語言、可擴充辨別語言
是否區分大小寫

Xml的特征

XML具有以下特點:

  • (1) XML可以從HTML中分離資料。即能夠在HTML檔案之外将資料存儲在XML文檔中,這樣可以使開發者集中精力使用HTML做好資料的顯示和布局,并確定資料改動時不會導緻HTML檔案也需要改動,進而友善維護頁面。XML也能夠将資料以“資料島”的形式存儲在HTML頁面中,開發者依然可以把精力集中到使用HTML格式化和顯示資料上。
  • (2) XML可用于交換資料。基于XML可以在不相容的系統之間交換資料,計算機系統和資料庫系統所存儲的資料有多種形式,對于開發者來說,最耗時間的工作就是在遍布網絡的系統之間交換資料。把資料轉換為XML格式存儲将大大減少交換資料時的複雜性,還可以使這些資料能被不同的程式讀取。
  • (3) XML可應用于B2B中。例如在網絡中交換金融資訊, 目前XML正成為遍布網絡的商業系統之間交換資訊所使用的主要語言,許多與B2B有關的完全基于XML的應用程式正在開發中。
  • (4)利用XML可以共享資料。XML資料以純文字格式存儲,這使得XML更易讀、更便于記錄、更便于調試,使不同系統、不同程式之間的資料共享變得更加簡單。
  • (5) XML可以充分利用資料。XML是與軟體、硬體和應用程式無關的,資料可以被更多的使用者、裝置所利用,而不僅僅限于基于HTML标準的浏覽器。其他用戶端和應用程式可以把XML文檔作為資料源來處理,就像操作資料庫一樣,XML的資料可以被各種各樣的“閱讀器”處理。
  • (6) XML可以用于建立新的語言。比如,WAP和WML語言都是由XML發展來的。WML(Wireless Markup Language,無線标記語言)是用于辨別運作于手持裝置上(比如手機)的Internet程式的工具,它就采用了XML的标準。

總之,XML使用一個簡單而又靈活的标準格式,為基于Web的應用提供了一個描述資料和交換資料的有效手段。但是,XML并非是用來取代HTML的。HTML着重如何描述将檔案顯示在浏覽器中,而XML與SGML相近,它着重描述如何将資料以結構化方式表示。

Xml的格式

XML檔案格式是純文字格式,在許多方面類似于HTML,XML由XML元素組成,每個XML元素包括一個開始标記(),一個結束标記()以及兩個标記之間的内容,例如,可以将XML元素标記為價格、訂單編号或名稱。标記是對文檔存儲格式和邏輯結構的描述。在形式上,标記中可能包括注釋、引用、字元資料段、起始标記、結束标記、空元素、文檔類型聲明( DTD)和序言。

具體規則如下:

  1. 必須有聲明語句。

    XML聲明是XML文檔的第一句,其格式如下:

    <?xml version="1.0" encoding="utf-8"?>           
  2. 注意大小寫

    在XML文檔中,大小寫是有差別的。“A”和“a”是不同的标記。注意在寫元素時,前後标記的大小寫要保持一緻。最好養成一種習慣,或者全部大寫,或者全部小寫,或者大寫第一個字母,這樣可以減少因為大小寫不比對而産生的文檔錯誤。

  3. XML文檔有且隻有一個根元素

    良好格式的XML文檔必須有一個根元素,就是緊接着聲明後面建立的第一個元素,其他元素都是這個根元素的子元素,根元素完全包括文檔中其他所有的元素。根元素的起始标記要放在所有其他元素的起始标記之前;根元素的結束标記要放在所有其他元素的結束标記之後。

  4. 屬性值使用引号

    在HTML代碼裡面,屬性值可以加引号,也可以不加。但是XML規定,所有屬性值必須加引号(可以是單引号,也可以是雙引号,建議使用雙引号),否則将被視為錯誤。

  5. 所有的标記必須有相應的結束标記

    在HTML中,标記可以不成對出現,而在XML中,所有标記必須成對出現,有一個開始标記,就必須有一個結束标記,否則将被視為錯誤。

  6. 所有的空标記也必須被關閉

    空标記是名額記對之間沒有内容的标記,比如“”等标記。在XML中,規定所有的标記必須有結束标記。

    例如:

    <?xml version="1.0" encoding="utf-8" ?>
    <i18n>
    <!-- 預設的語言,以主程式的優先 -->
    <locale id="2052" />
    <!-- 語言文字清單 -->
    <StringBundle>
        <configfile name="SSOStringBundle.xml"/>
    </StringBundle>
    <!-- 地區資訊,目前隻需要一個, SSOPlatform不需要地區資訊 -->
    <!--Location2>
        <configfile name="LocList.xml"/>
    </Location2-->
    </i18n>           

    與HTML的差別

    • (1)可擴充性方面:HTML不允許使用者自行定義他們自己的辨別或屬性,而在XML中,使用者能夠根據需要自行定義新的辨別及屬性名,以便更好地從語義上修飾資料。
    • (2)結構性方面:HTML不支援深層的結構描述,XML的檔案結構嵌套可以複雜到任意程度,能表示面向對象的等級層次。
    • (3)可校驗性方面:HTML沒有提供規範檔案以支援應用軟體對HTML檔案進行結構校驗,而XML檔案可以包括一個文法描述,使應用程式可以對此檔案進行結構校驗。

對Xml進行操作

讀取xml檔案:

//讀取xml檔案
//将XML檔案加載進來
System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load("config.xml");
//擷取到XML的根元素進行操作
System.Xml.Linq.XElement root = document.Root;
//擷取usually子節點
System.Xml.Linq.XElement usually = root.Element("usually");
//擷取usually子節點中的元素值
string temp = usually.Value;//此時temp = "am";           

目前xml檔案内容如下:

<!--目前xml檔案内容如下-->
<?xml version="1.0" encoding="utf-8"?> <!--固有表頭-->
<System.Config>              <!--根節點-->
  <usually>am</usually>         <!--usually子節點-->
</System.Config>             <!--根節點尾部辨別-->           

建立xml檔案,并添加元素

//建立xml檔案,并進行修改操作
//聲明
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
xmlnode.InnerText += " encoding=\"utf-8\"";
xmldoc.AppendChild(xmlnode);

//CreateElement的參數:
//    prefix:
//     新元素的字首(如果有的話)。 String.Empty 與 null 等效。
//
//   localName:
//     新元素的本地名稱。
//
//   namespaceURI:
//     新元素的命名空間 URI(如果有的話)。 String.Empty 與 null 等效。
//添加根節點
XmlElement xmlelementroot = xmldoc.CreateElement("", "System.Config", "");
//根節點包含節點文本時會造成XML文檔結構的混亂
//xmltext = xmldoc.CreateTextNode("配置資訊");
//xmlelementroot.AppendChild(xmltext);
xmldoc.AppendChild(xmlelementroot);

//添加一個元素
XmlElement xmlelement0 = xmldoc.CreateElement("", "usually1", "");
xmltext = xmldoc.CreateTextNode("am");
xmlelement0.AppendChild(xmltext);
xmldoc.ChildNodes.Item(1).AppendChild(xmlelement0);
//添加另一個元素
XmlElement xmlelement1 = xmldoc.CreateElement("", "usually2", "");
xmltext = xmldoc.CreateTextNode("pm");
xmlelement1.AppendChild(xmltext);
mldoc.ChildNodes.Item(1).AppendChild(xmlelement1);

//儲存
xmldoc.Save("config.xml");           

建立的xml檔案内容如下:

<?xml version="1.0" encoding="utf-8"?>
<System.Config>
    <usually1>am</usually1>
  <usually2>pm</usually2>
</System.Config>           

對xml檔案内容進行增删改查等操作:

//節點.net沒提供修改的方法本文也不做處理
//修改屬性與新增實質是同一個方法
XDocument xDoc = XDocument.Load("config.xml");
XElement element = (XElement)xDoc.Element("usually1").Element("am");
element.Remove();
xDoc.Save("config.xml");

//對節點進行查找并輸出
XmlDocument doc = new XmlDocument();
doc.Load("orders.xml");
XmlNodeList nodes = doc.SelectNodes("/System.Config/usually2");
foreach (XmlNode node in nodes) {
    if(node.InnerText =="pm")
        Console.WriteLine(node.InnerText);
}           

更新對Xml檔案進行更新修改(添加了對xml讀寫修改的方法)

2021年09月09日-13:31補充

/// <summary>
/// 操作配置檔案config.xml
/// </summary>
public class Config
{
    private static readonly string path = "config";
    private static readonly string filename = "config/config.xml";

    /// <summary>
    /// 擷取模式設定(日間、夜間或自動)
    /// </summary>
    /// <returns>am、pm or anto</returns>
    public static string GetModel()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                XDocument document = XDocument.Load(filename);
                XElement root = document.Root;
                XElement model = root.Element("model");
                return model.Value;
            }
            catch (Exception)
            {
                ModityConfig("model", "auto");
                return "auto";
            }
        }
        else { ModityConfig("model", "auto"); return "auto"; }
    }
    /// <summary>
    /// 是否開機自啟
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetStart()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                XDocument document = XDocument.Load(filename);
                XElement root = document.Root;
                XElement startup = root.Element("startup");
                if (startup.Value == "on") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("startup", "off");
                return false;
            }
        }
        else { ModityConfig("startup", "off"); return false; }
    }
    /// <summary>
    /// 是否自動登入
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetAutologin()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load(filename);
                System.Xml.Linq.XElement root = document.Root;
                System.Xml.Linq.XElement autologin = root.Element("autologin");
                if (autologin.Value == "on") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("autologin", "off");
                return false;
            }
        }
        else { ModityConfig("autologin", "off"); return false; }
    }
    /// <summary>
    /// 是否自動更新
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetUpdate()
    {
        if (FindConfig() == true)
        {
            try
            {
                System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load(filename);
                System.Xml.Linq.XElement root = document.Root;
                System.Xml.Linq.XElement update = root.Element("update");
                if (update.Value == "auto") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("update", "auto");
                return true;
            }
        }
        else { ModityConfig("update", "auto"); return false; }
    }
    /// <summary>
    /// 查找配置檔案是否存在
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean FindConfig()
    {
        //如果目錄不存在
        if (System.IO.Directory.Exists(path) == false) { System.IO.Directory.CreateDirectory(path); }
        //如果配置檔案不存在
        if (System.IO.File.Exists(filename) == false)
        {
            FileStream fs = new FileStream(filename, FileMode.Create);
            fs.Close();
            XmlDocument xmldoc = new XmlDocument();
            XmlText xmltext;

            //聲明
            XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
            xmlnode.InnerText += " encoding=\"utf-8\"";
            xmldoc.AppendChild(xmlnode);

            //添加根節點
            XmlElement xmlelementroot = xmldoc.CreateElement("", "System.Config", "");
            xmldoc.AppendChild(xmlelementroot);

            //添加一個元素
            XmlElement xmlelement0 = xmldoc.CreateElement("", "model", "");
            xmltext = xmldoc.CreateTextNode("am");
            xmlelement0.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement0);

            //添加另一個元素
            XmlElement xmlelement1 = xmldoc.CreateElement("", "startup", "");
            xmltext = xmldoc.CreateTextNode("on");
            xmlelement1.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement1);

            //添加另一個元素
            XmlElement xmlelement2 = xmldoc.CreateElement("", "autologin", "");
            xmltext = xmldoc.CreateTextNode("off");
            xmlelement2.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement2);

            //添加另一個元素
            XmlElement xmlelement3 = xmldoc.CreateElement("", "update", "");
            xmltext = xmldoc.CreateTextNode("auto");
            xmlelement3.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement3);

            //儲存
            xmldoc.Save(filename);

            return true;
        }
        else { return true; }
    }
    /// <summary>
    /// 修改配置資訊
    /// </summary>
    /// <param name="name">結點名稱</param>
    /// <param name="value">結點值</param>
    public static void ModityConfig(string name, string value)
    {
        //将XML檔案加載進來
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filename);
        XmlNode root = xmlDoc.SelectSingleNode("System.Config");
        XmlElement xe = xmlDoc.CreateElement(name);
        xe.InnerText = value;
        root.AppendChild(xe);
        xmlDoc.Save(filename);
    }
    /// <summary>
    /// 更新配置資訊
    /// </summary>
    /// <param name="name">結點名稱</param>
    /// <param name="value">更新值</param>
    public static void UpdateConfig(string name, string value)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filename);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode("System.Config").ChildNodes;
        foreach (XmlNode xn in nodeList)//周遊所有子節點   
        {
            XmlElement xe = (XmlElement)xn;//轉換類型   
            if (xe.Name == name)//如果找到
            {
                xe.InnerText = value;
            }
        }
        xmlDoc.Save(filename);
    }
}           

寫在最後

  1. 李曉軍主編.城市地下空間資訊化技術指南:同濟大學出版社,2016.04:第3頁
  2. 青島英谷教育科技股份有限公司編著.Web程式設計基礎:西安電子科技大學出版社,2016.01:第189頁
  3. 袁滿,吳曉宇,黃剛,張岩,杜睿山編著.移動計算(修訂版):哈爾濱工業大學出版社,2015.08:第227頁
  4. 李海生著.知識管理技術與應用:北京郵電大學出版社,2012.04:第27頁