.net xml相關操作和.net core xml序列化


1、回顧一下 .net 操作xml

        XmlDocument xmldoc = new XmlDocument();
            //加入XML的聲明段落:<?xmlversion="1.0" encoding="utf-8"?>
            XmlDeclaration xmldecl = xmldoc.CreateXmlDeclaration("1.0", "utf-8", null);
            xmldoc.AppendChild(xmldecl);

            //保存文件
            xmldoc.Save(@"D:\user\test.xml");

            //加載xml文件
            xmldoc.Load(@"D:\user\test.xml");
            //加載xml內容
            string xmlStr = "<root><user><person><name>張三<name/><Tel /></person><user/></root>";
            xmldoc.LoadXml(xmlStr);

            //給xml創建節點
            XmlElement rootNode = xmldoc.CreateElement("root");
            xmldoc.AppendChild(rootNode);

            //然后給root 添加子節點
            XmlElement userNode = xmldoc.CreateElement("user");
            rootNode.AppendChild(userNode);


            //獲取xml 根元素
            XmlElement getRoot = xmldoc.DocumentElement;
            //根據標簽名稱獲取 元素(第一個)
            XmlNode xmlNodeUser = xmldoc.SelectSingleNode("user");
            XmlNode xmlNodeUser1 = xmldoc.SelectNodes("user").Item(0);//獲取所以然后取第一個

            //指定node 屬性 獲取如:
            XmlNode node = xmldoc.SelectSingleNode("root/user/pserson[@name='張三']");

            //獲取node 集合
            XmlNodeList nodes = xmldoc.SelectNodes("root/user/person");
            //獲取節點下 子節點集合
            XmlNodeList nodes1 = xmldoc.SelectSingleNode("root").ChildNodes;
            //獲取根節點下的標簽名為person的節點集合
            XmlNodeList nodelist = xmldoc.GetElementsByTagName("person");

            //節點遍歷
            foreach (XmlNode childNode in nodelist) {
                
            }

            //刪除節點
            //刪除其下所有節點和其本身的屬性以(只剩下標簽)
            xmldoc.RemoveAll();
            //刪除指定節點,括號里傳入的是節點名 如:指定刪除 pserson[@name='張三']
            xmldoc.RemoveChild(node);

            //對節點屬性值的操作
            //設置節點屬性和節點值
            //給xml創建節點 
            XmlElement person = xmldoc.CreateElement("user");
            //方法一:
            person.SetAttribute("name", "張三");
            //方法二:這種方法可以用來獲取和設置屬性值,但前提是該屬性要存在
            person.Attributes["name"].Value = "張三三";
            //方法三
            XmlAttribute age = xmldoc.CreateAttribute("age");
            age.Value = "23";
            person.Attributes.Append(age);
            //設置文本節點
            person.InnerText = "123";
            
            rootNode.AppendChild(person);

            //獲取設置的節點
            string name = person.Attributes["name"].Value.ToString();
            string name1 = person.GetAttribute("name").ToString();
            XmlAttribute attribute = (XmlAttribute)person.SelectSingleNode("@name");//通過 SelectSingleNode 查找屬性 name 的值

            //刪除屬性
            person.RemoveAllAttributes();//刪除所以
            person.RemoveAttribute("name");//指定刪除
            person.RemoveAttributeAt(0);//刪除位置所在的屬性

2、.net core 操作 xml (主要是序列化和反序列化)

using System;
using System.Globalization;
using System.IO;
using System.Xml.Serialization;
public class XMLConvert
    {
        /// <summary>
        /// 創建xml序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToXml<T>(T obj) {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
                serializer.Serialize(writer, obj);

                string xml = writer.ToString();
                writer.Close();
                writer.Dispose();
                return xml;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

        /// <summary>
        /// xml反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T GetT<T>(string xml) {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                StringReader reader = new StringReader(xml);

                T res = (T)serializer.Deserialize(reader);
                reader.Close();
                reader.Dispose();
                return res;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

另外: .net core 讀取配置文件信息

因為在.net core跨平台中:配置文件與之前.NET Framework采用xml的config文件不同,目前主要是采用json文件鍵值對配置方式讀取。

需要引用 nuget包 : System.Configuration.ConfigurationManager  和  Microsoft.Extensions.Configuration.Abstractions

操作json 文件的讀取 需要安裝:Microsoft.Extensions.Configuration.Json 

操作xml  文件的讀取 需要安裝:Microsoft.Extensions.Configuration.xml

此處聲明一下 json 和xml 的讀取 代碼差不多的

     /// <summary>
        /// xml配置文件讀取
        /// </summary>
        /// <param name="configFileName"></param>
        /// <param name="basePath"></param>
        /// <returns></returns>
        public static IConfigurationRoot GetXmlConfig(
                    string configFileName = "appsettings.xml",
                    string basePath = "")
        {
            basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;

            var builder = new ConfigurationBuilder().
               //SetBasePath(basePath).
               AddXmlFile(b =>
               {
                   b.Path = configFileName;
                   b.FileProvider = new PhysicalFileProvider(basePath);
               });
            return builder.Build();
        }
     /// <summary>
        /// json配置文件讀取
        /// </summary>
        /// <param name="configFileName"></param>
        /// <param name="basePath"></param>
        /// <returns></returns>
        public static IConfigurationRoot GetJsonConfig(
                    string configFileName = "appsettings.json",
                    string basePath = "")
        {
            basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;

            var builder = new ConfigurationBuilder().
                    SetBasePath(basePath).
                    AddJsonFile(configFileName);
            return builder.Build();
        }

配置文件的屬性的讀取

        var configXml = GetXmlConfig();
            Console.WriteLine($"UserName:{configXml.GetSection("testApi:UserName").Value}\n");
            Console.WriteLine($"UserName:{configXml.GetSection("testApi:UserPwd").Value}\n");


            var configJson = GetJsonConfig();
            Console.WriteLine($"UserName:{configJson.GetSection("testApi:UserName").Value}\n");
            Console.WriteLine($"UserName:{configJson.GetSection("testApi:UserPwd").Value}\n");

 

3、xml 運用場景

1、數據交換

        XML使用元素和屬性來描述數據。在數據傳送過程中,XML始終保留了諸如父/子關系這樣的數據結構。幾個應用程序可以共享和解析同一個XML文件,不必 使用傳統的字符串解析或拆解過程。相反,普通文件不對每個數據段做描述(除了在頭文件中),也不保留數據關系結構。使用XML做數據交換可以使應用程序更 具有彈性,因為可以用位置(與普通文件一樣)或用元素名(從數據庫)來存取XML數據。

  另外,XML還能夠簡化數據共享。在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。XML 數據以純文本格式進行存儲,因此提供了一種獨立於軟件和硬件的數據存儲方法。這讓創建不同應用程序可以共享的數據變得更加容易。

2、XML把數據從HTML分離

   如果你需要在 HTML 文檔中顯示動態數據,那么每當數據改變時將花費大量的時間來編輯 HTML。通過 XML,數據能夠存儲在獨立的 XML 文件中。這樣你就可以專注於使用 HTML 進行布局和顯示,並確保修改底層數據不再需要對 HTML 進行任何的改變。通過使用幾行 JavaScript,你就可以讀取一個外部 XML 文件,然后更新 HTML 中的數據內容。

3、Web服務 

   Web服務是最令人激動的革命之一,它讓使用不同系統和不同編程語言的人們能夠相互交流和分享數據。其基礎在於Web服務器用XML在系統之間交換數據。交換數據通常用XML標記,能使協議取得規范一致,比如在簡單對象處理協議(Simple Object Access Protocol, SOAP)平台上。 

   SOAP可以在用不同編程語言構造的對象之間傳遞消息。這意味着一個C#對象能夠與一個Java對象進行通訊。這種通訊甚至可以發生在運行於不同操作系統上的對象之間。DCOM, CORBA或Java RMI只能在緊密耦合的對象之間傳遞消息,SOAP則可在松耦合對象之間傳遞消息。 

4、內容管理 

   XML只用元素和屬性來描述數據,而不提供數據的顯示方法。這樣,XML就提供了一個優秀的方法來標記獨立於平台和語言的內容。使用象XSLT這樣的語言能夠輕易地將XML文件轉換成各種格式文件,比如HTML, WML, PD F, flat file, EDI, 等等。XML具有的能夠運行於不同系統平台之間和轉換成不同格式目標文件的能力使得它成為內容管理應用系統中的優秀選擇。 

5、XML 簡化平台的變更

   升級到新的系統(硬件或軟件平台),總是非常費時的。必須轉換大量的數據,不兼容的數據經常會丟失。XML 數據以文本格式存儲。這使得 XML 在不損失數據的情況下,更容易擴展或升級到新的操作系統、新應用程序或新的瀏覽器。

6、XML 用於創建新的Internet語言

 很多新的 Internet 語言是通過 XML 創建的,如:

  • XHTML - 最新的 HTML 版本 

  • WSDL - 用於描述可用的 web service 

  • WAP 和 WML - 用於手持設備的標記語言 

  • RSS - 用於 RSS feed 的語言 

  • RDF 和 OWL - 用於描述資源和本體 

  • SMIL - 用於描述針針對 web 的多媒體 

    這里所述的幾種使用並不包括全部場合。XML的產生和利用主要用於數據交換,而且XML是良構的,所以作為數據交換很方便.例如:一個是財務軟件,一個是 業務系統軟件,兩個程序都有一個接口支持外部導入數據,那么用XML就很不錯,起碼在數據格式上做到了規范,而不用考慮對方是什么數據庫等等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM