.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	est.xml");

            //加载xml文件
            xmldoc.Load(@"D:user	est.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}
");
            Console.WriteLine($"UserName:{configXml.GetSection("testApi:UserPwd").Value}
");


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

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就很不错,起码在数据格式上做到了规范,而不用考虑对方是什么数据库等等。

原文地址:https://www.cnblogs.com/lau-4/p/11356550.html