C# XML解析

2022/6/1 1:21:12

本文主要是介绍C# XML解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

通过XML属性解析

XML文件

<?xml version="1.0" encoding="utf-8" ?>
<Lists>
  <List>
    <Item CN="CN1" EN="SN1">Item1</Item>
    <Item CN="CN2" EN="SN2">Item2</Item>
    <Item CN="CN3" EN="SN3">Item3</Item>
    <Item CN="CN4" EN="SN4">Item4</Item>
    <Item CN="CN5" EN="SN5">Item5</Item>
  </List>
  <key>
    <ID id="1">id</ID>
    <Name name="2">name</Name>
  </key>
</Lists>

解析

                XmlDocument doc = new XmlDocument();
                //doc.LoadXml("XML字符串");
                doc.Load("XML文件路径");
                var listNodes = doc.SelectSingleNode("Lists").ChildNodes[0];//表示Lists下的List的所有数据
                var keyNodes = doc.SelectSingleNode("Lists").ChildNodes[1];//表示Lists下的key的所有数据
                #region 获取属性的值

                //获取属性的值
                string CN1 = listNodes.SelectSingleNode("Item").Attributes["CN"].Value;//SelectSingleNode 表示第一个

                CN1 = ((XmlElement)listNodes.SelectSingleNode("Item")).GetAttribute("CN");


                CN1 = listNodes.SelectNodes("Item")[0].Attributes["CN"].Value; //SelectNodes 表示查询所有
                CN1 = doc.SelectSingleNode("Lists/List/Item").Attributes["CN"].Value;
                CN1 = doc.SelectNodes("Lists/List/Item")[0].Attributes["CN"].Value;

                string EN2 = listNodes.SelectNodes("Item")[1].Attributes["EN"].Value; //SelectNodes 表示查询所有
                EN2 = doc.SelectNodes("Lists/List/Item")[1].Attributes["EN"].Value;

                string one = keyNodes.SelectSingleNode("ID").Attributes["id"].Value;
                string two = keyNodes.SelectSingleNode("Name").Attributes["name"].Value;
                #endregion

                #region 获取节点的值

                //获取节点的值
                string Item1 = doc.SelectSingleNode("Lists/List/Item").InnerText;
                Item1 = listNodes.SelectSingleNode("Item").InnerText;
                string Item2 = doc.SelectNodes("Lists/List/Item")[1].InnerText;
                string id = doc.SelectSingleNode("Lists/key/ID").InnerText;
                string name = doc.SelectSingleNode("Lists/key/Name").InnerText;
                id = keyNodes.SelectSingleNode("ID").InnerText;
                name = keyNodes.SelectSingleNode("Name").InnerText;

                #endregion

                #region 循环遍历读取,添加至 Dictionary
                Dictionary<string, string> dic = new Dictionary<string, string>();
                var nodes = doc.SelectSingleNode("Lists/key").ChildNodes;
                foreach (XmlNode item in nodes)
                {
                    XmlElement xe = (XmlElement)item;
                    string id2 = xe.GetAttribute("id");//属性
                    dic.Add(xe.Name, xe.InnerText);
                }
                string id3 = dic.FirstOrDefault(q => q.Key == "ID").Value;

                #endregion

XML转换对象

XMLHelper类

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;


namespace ConsoleApp2
{
	/// <summary>
	/// XML工具类
	/// </summary>
	public static class XmlHelper
	{
		/// <summary>
		/// 将一个对象序列化为XML字符串。这个方法将不生成XML文档声明头。
		/// </summary>
		/// <param name="o">要序列化的对象</param>
		/// <returns>序列化产生的XML字符串</returns>
		public static string XmlSerializerObject(object o)
		{
			if (o == null)
				throw new ArgumentNullException("对象不能为null");

			Encoding encoding = Encoding.UTF8;
			XmlSerializer serializer = new XmlSerializer(o.GetType());
			using (MemoryStream stream = new MemoryStream())
			{
				XmlWriterSettings settings = new XmlWriterSettings();
				settings.Indent = true;
				settings.NewLineChars = "\r\n";
				settings.Encoding = encoding;
				settings.OmitXmlDeclaration = true;
				settings.IndentChars = "    ";

				XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
				ns.Add("", "");

				using (XmlWriter writer = XmlWriter.Create(stream, settings))
				{
					serializer.Serialize(writer, o, ns);
					writer.Close();
				}
				//return Encoding.UTF8.GetString(stream.ToArray());

				stream.Position = 0;
				using (StreamReader reader = new StreamReader(stream, encoding))
				{
					return reader.ReadToEnd();
				}
			}
		}

		private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
		{
			if (o == null)
				throw new ArgumentNullException("o");
			if (encoding == null)
				throw new ArgumentNullException("encoding");

			XmlSerializer serializer = new XmlSerializer(o.GetType());

			XmlWriterSettings settings = new XmlWriterSettings();
			settings.Indent = true;
			settings.NewLineChars = "\r\n";
			settings.Encoding = encoding;
			settings.IndentChars = "    ";

			using (XmlWriter writer = XmlWriter.Create(stream, settings))
			{
				serializer.Serialize(writer, o);
			}
		}


        /// <summary>
        /// 将一个对象序列化为XML字符串
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>序列化产生的XML字符串</returns>
        public static string XmlSerialize(object o, Encoding encoding)
		{
			using (MemoryStream stream = new MemoryStream())
			{
				XmlSerializeInternal(stream, o, encoding);

				stream.Position = 0;
				using (StreamReader reader = new StreamReader(stream, encoding))
				{
					return reader.ReadToEnd();
				}
			}
		}


		/// <summary>
		/// 将一个对象按XML序列化的方式写入到一个文件(采用UTF8编码)
		/// </summary>
		/// <param name="o">要序列化的对象</param>
		/// <param name="path">保存文件路径</param>
		public static void XmlSerializeToFile(object o, string path)
		{
			XmlSerializeToFile(o, path, Encoding.UTF8);
		}

		/// <summary>
		/// 将一个对象按XML序列化的方式写入到一个文件
		/// </summary>
		/// <param name="o">要序列化的对象</param>
		/// <param name="path">保存文件路径</param>
		/// <param name="encoding">编码方式</param>
		public static void XmlSerializeToFile(object o, string path, Encoding encoding)
		{
			if (string.IsNullOrEmpty(path))
				throw new ArgumentNullException("path");

			using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write))
			{
				XmlSerializeInternal(file, o, encoding);
			}
		}



		/// <summary>
		/// 从XML字符串流中反序列化对象
		/// </summary>
		/// <param name="stream">包含对象的XML字符串流</param>
		/// <param name="destType">要序列化的目标类型</param>
		/// <returns>反序列化得到的对象</returns>
		public static object XmlDeserialize(Stream stream, Type destType)
		{
			if (stream == null)
				throw new ArgumentNullException("stream");
			if (destType == null)
				throw new ArgumentNullException("destType");

			XmlSerializer mySerializer = new XmlSerializer(destType);

			using (StreamReader sr = new StreamReader(stream))
			{
				return mySerializer.Deserialize(sr);
			}
		}

		/// <summary>
		/// 从XML字符串中反序列化对象
		/// </summary>
		/// <param name="s">包含对象的XML字符串</param>
		/// <param name="destType">要序列化的目标类型</param>
		/// <param name="encoding">编码方式</param>
		/// <returns>反序列化得到的对象</returns>
		public static object XmlDeserialize(string s, Type destType, Encoding encoding)
		{
			if (string.IsNullOrEmpty(s))
				throw new ArgumentNullException("s");
			if (destType == null)
				throw new ArgumentNullException("destType");
			if (encoding == null)
				throw new ArgumentNullException("encoding");

			using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
			{
				return XmlDeserialize(ms, destType);
			}
		}


		/// <summary>
		/// 从XML字符串中反序列化对象
		/// </summary>
		/// <typeparam name="T">结果对象类型</typeparam>
		/// <param name="s">包含对象的XML字符串</param>
		/// <returns>反序列化得到的对象</returns>
		public static T XmlDeserialize<T>(string s)
		{
			return (T)XmlDeserialize(s, typeof(T), Encoding.UTF8);
		}

		/// <summary>
		/// 读入一个文件,并按XML的方式反序列化对象。
		/// </summary>
		/// <typeparam name="T">结果对象类型</typeparam>
		/// <param name="path">文件路径</param>
		/// <returns>反序列化得到的对象</returns>
		public static T XmlDeserializeFromFile<T>(string path)
		{
			if (string.IsNullOrEmpty(path))
				throw new ArgumentNullException("path");

			try
			{
				using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))
				{
					return (T)XmlDeserialize(fs, typeof(T));
				}
			}
			catch (Exception ex)
			{
				throw new InvalidDataException("XML反序列失败,当前文件:" + path, ex);
			}
		}

		/// <summary>
		/// 获取XML跟节点的值
		/// </summary>
		/// <param name="path">文件路径</param>
		/// <returns></returns>
		public static string XmlGetElementName(string path) 
		{	
			XmlDocument xmlDoc = new XmlDocument();
			xmlDoc.Load(path);
			return xmlDoc.DocumentElement.Name;
		}
	}
}

XML文件

<?xml version="1.0" encoding="utf-8"?>
<Entity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="04f16101-0256-4228-b7a8-08d95590738f" Name="测试名称" DisplayName="备注">
    <Status StatusId="ca119874-1788-479f-b79b-08d95590738z">成功</Status>
    <Tags>标签A</Tags>
    <Tags>标签B</Tags>
    <Tags>标签C</Tags>
    <Attributes>
        <Attribute Status="1" Type="type">
            <Id>ca119874-1788-479f-b79b-08d95590738f</Id>
            <Name>张三</Name>
        </Attribute>
        <Attribute Status="2" Type="type">
            <Id>ca119874-1788-479f-b79b-08d955907382</Id>
            <Name>李四</Name>
        </Attribute>
    </Attributes>
</Entity>

XML转换成对象

   var Metadata = XmlHelper.XmlDeserializeFromFile<Entity>(@"F:\DownLoad\Test2.xml");

实体类

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace ConsoleApp2
{
    [XmlRoot("Entity")]
    public class Entity
    {

        [XmlAttribute("Id")]
        public Guid EntityId { get; set; }

        [XmlAttribute]
        public string Name { get; set; }

        [XmlAttribute]
        public string DisplayName { get; set; }

        [XmlElement("Status")]
        public StatusEntity StatusEntity { get; set; }

        //[XmlArrayItem("Attribute")]       //和[XmlType("Attribute")] 效果一样
        [XmlArray("Attributes")]
        public List<Attributes> Attributes { get; set; }

        [XmlElement("Tags")]
        public List<string> Tags { set; get; }

        [XmlIgnore]
        public string Name2 { get; set; }
    }
    [XmlRoot("Status")]
    public class StatusEntity
    {
        [XmlAttribute("StatusId")]
        public string Id { get; set; }

        [XmlText]
        //获取Status 节点的值
        public string Value { get; set; }
    }

    [XmlType("Attribute")]
    public class Attributes
    {

        [XmlElement("Id")]
        public Guid AttributeId { get; set; }

        [XmlAttribute("Type")]
        public string Type { get; set; }

        [XmlElement]
        public string Name { get; set; }
    }
}


这篇关于C# XML解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程