zoukankan      html  css  js  c++  java
  • XML操作

    1.简单读写:

    引入using System.Xml;命名空间

    写操作

    //创建XmlDocument对象
     XmlDocument doc = new XmlDocument();
    
    //载入(.load方法载入具体文件)
     doc.LoadXml("<Student type='regular' Section='B'><Name>xlh</Name></Student>");
    //常用属性方法有SelectSingleNode,ChildNodes,GetAttribute,AppendChild等,处理逻辑为遍历查找,例如: XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点,对于指定名称节点可以通过  XmlNodeList lis = doc.GetElementsByTagName("Name") ,然后取值 String str = lis[0].InnerText 获得。
    foreach (XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 if (xe.GetAttribute("genre") == "李赞红")//如果genre属性值为“李赞红” { xe.SetAttribute("genre", "update李赞红");//则修改该属性为“update李赞红” XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach (XmlNode xn1 in nls)//遍历 { XmlElement xe2 = (XmlElement)xn1;//转换类型 if (xe2.Name == "author")//如果找到 { xe2.InnerText = "亚胜";//则修改 break;//找到退出来就可以了 } } break; } }

    也可以通过XmlWriter来进行写入

    读操作

    通过XmlReader读取器例如

     using (XmlReader read = XmlReader.Create(xmUrl))
                {
                    while (read.Read())
                    {
                        switch (read.NodeType)
                        {
                            case XmlNodeType.Element:
                                break;
                            case XmlNodeType.Text:
                                xs += read.Value + "|";
                                break;
                        }
                    }
                }

    将文本内容取出,或者 XmlNodeList lis = doc.GetElementsByTagName("Name") 遍历指定属性来获取。以上方法只适合简单少量的读取,对于规则性数据还要采用序列化的方式。

    创建操作参见http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html

    2.序列化使用:

    系列化将数据封装在数据实体中,所以使用时先定义实体类

    [XmlRoot("Root")]
    public class People
        {
            [XmlAttribute("NAME")]
            public string Name
            { set; get; }
            [XmlAttribute("AGE")]
            public int Age
            { set; get; }
        }
        [XmlRoot("Root")]
        public class Student : People
        {
            [XmlElement("CLASS")]
            public string Class
            { set; get; }
            [XmlElement("NUMBER")]
            public int Number
            { set; get; }
        }

    定义特性直接表示了xml文档结构关系。处理单元中要处理的数据

       Student stu = new Student()
                {
                    Age = 10,
                    Class = "Class One",
                    Name = "Tom",
                    Number = 1
                };

    序列化

           XmlSerializer ser = new XmlSerializer(typeof(Student));
                ser.Serialize(File.Create("C:\x.xml"), stu);

    反序列化

    XmlSerializer ser = new XmlSerializer(typeof(Student));
                Student stu = ser.Deserialize(File.OpenRead("C:\x.xml")) as Stud

    关于序列化操作找到一个封装好的操作类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Serialization;
    using System.IO;
    using System.Xml;
    
    // 此处代码来源于博客【在.net中读写config文件的各种方法】的示例代码
    // http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html
    
    namespace MyMVC
    {
        public static class XmlHelper
        {
            /// <summary>
            /// 序列化操作以及流中换行处理
            /// </summary>
            /// <param name="stream"></param>
            /// <param name="o"></param>
            /// <param name="encoding"></param>
            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 = "
    ";
                settings.Encoding = encoding;
                settings.IndentChars = "    ";
                //按照相关设置快速序列化对象
                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {
                    serializer.Serialize(writer, o);
                    writer.Close();
                }
            }
    
            /// <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序列化的方式写入到一个文件
            /// </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>
            /// <typeparam name="T">结果对象类型</typeparam>
            /// <param name="s">包含对象的XML字符串</param>
            /// <param name="encoding">编码方式</param>
            /// <returns>反序列化得到的对象</returns>
            public static T XmlDeserialize<T>(string s, Encoding encoding)
            {
                if (string.IsNullOrEmpty(s))
                    throw new ArgumentNullException("s");
                if (encoding == null)
                    throw new ArgumentNullException("encoding");
    
                XmlSerializer mySerializer = new XmlSerializer(typeof(T));
                using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
                {
                    using (StreamReader sr = new StreamReader(ms, encoding))
                    {
                        return (T)mySerializer.Deserialize(sr);
                    }
                }
            }
    
            /// <summary>
            /// 读入一个文件,并按XML的方式反序列化对象。
            /// </summary>
            /// <typeparam name="T">结果对象类型</typeparam>
            /// <param name="path">文件路径</param>
            /// <param name="encoding">编码方式</param>
            /// <returns>反序列化得到的对象</returns>
            public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
            {
                if (string.IsNullOrEmpty(path))
                    throw new ArgumentNullException("path");
                if (encoding == null)
                    throw new ArgumentNullException("encoding");
    
                string xml = File.ReadAllText(path, encoding);
                return XmlDeserialize<T>(xml, encoding);
            }
        }
    }
    View Code

    一个使用xmlDocument的方法

            /// <summary>
            /// 将xml字符串映射为实体类 
            /// </summary>
            /// <typeparam name="T">实体类类型</typeparam>
            /// <param name="xml">xml字符串</param>
            /// <returns>实体类</returns>
            public dynamic ChangeXmlToEntity<T>(string xml)
            {
                dynamic entity = Activator.CreateInstance<T>();
                doc = new XmlDocument();
                doc.LoadXml(xml);
                xe = doc.DocumentElement;
                foreach (PropertyInfo p in entity.GetType().GetProperties())
                {
                    Type toType = p.PropertyType;
                    if (p.PropertyType == typeof(int?)) { toType = typeof(int); }
                    else if (p.PropertyType == typeof(decimal?)) { toType = typeof(decimal); }
                    else if (p.PropertyType == typeof(float?)) { toType = typeof(float); }
                    else if (p.PropertyType == typeof(double?)) { toType = typeof(double); }
                    else if (p.PropertyType == typeof(DateTime?)) { toType = typeof(DateTime); }
                    else if (p.PropertyType == typeof(string)) { toType = typeof(string); }
                    MethodInfo m = p.GetSetMethod();
                    m.Invoke(entity, parameters: new object[] { Convert.ChangeType(xe.GetElementsByTagName(p.Name)[0].InnerText, toType) });
                }
                return entity;
            }

    补充:关于序列化不光xml序列化,json数据也需要序列化

    .net3.5以上可以通过DataContractJsonSerializer类和JavaScriptSerializer类序列化操作 (DataContractJsonSerializer在.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用,在System.Runtime.Serialization.Json命名空间下;.NET Framework 4在System.Runtime.Serialization中)

    还可以使用XmlSerializer(.net2.0)

    命名空间:System.Xml.Serialization
    程序集:System.Xml(在 system.xml.dll 中)

    例如

    //序列化
    string
    r1 = jsonSerializer.Serialize(personnel); //反序列化 Personnel _Personnel = jsonSerializer.Deserialize<Personnel>(r1);

    .net2.0可以使用第三方的Newtonsoft.Json.dll进行序列化,例如:

     JsonSerializer jsser = new JsonSerializer();
    //wInfo为事先定义好的实体类
     wInfo = JsonConvert.DeserializeObject<IpInfo>(jsonData);

     另一个更加强大的序列化操作类,出处:http://www.cnblogs.com/yank/p/3198082.html

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;
    using System.Xml.Serialization;
    
    namespace SerializerSample
    {
        /// <summary>
        /// 序列化帮助类
        /// </summary>
        public sealed class SerializeHelper
        { 
            #region DataContract序列化
            /// <summary>
            /// DataContract序列化
            /// </summary>
            /// <param name="value"></param>
            /// <param name="knownTypes"></param>
            /// <returns></returns>
            public static string SerializeDataContract(object value, List<Type> knownTypes = null)
            {
                DataContractSerializer dataContractSerializer = new DataContractSerializer(value.GetType(), knownTypes);
    
                using (MemoryStream ms = new MemoryStream())
                {
                    dataContractSerializer.WriteObject(ms, value);
                    ms.Seek(0, SeekOrigin.Begin);
                    using (StreamReader sr = new StreamReader(ms))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            /// <summary>
            /// DataContract反序列化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="xml"></param>
            /// <returns></returns>
            public static T DeserializeDataContract<T>(string xml)
            {
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
                {
                    DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                    return (T)serializer.ReadObject(ms);
                }
            }
            #endregion
    
            #region DataContractJson序列化
            /// <summary>
            ///  DataContractJson序列化
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string SerializeDataContractJson(object value)
            {
                DataContractJsonSerializer dataContractSerializer = new DataContractJsonSerializer(value.GetType());
                using (MemoryStream ms = new MemoryStream())
                {                
                    dataContractSerializer.WriteObject(ms, value);
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
            /// <summary>
            ///  DataContractJson反序列化
            /// </summary>
            /// <param name="type"></param>
            /// <param name="str"></param>
            /// <returns></returns>
            public static object DeserializeDataContractJson(Type type, string str)
            {
                DataContractJsonSerializer dataContractSerializer = new DataContractJsonSerializer(type);
                using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(str)))
                {
                    return dataContractSerializer.ReadObject(ms);
                }
            }
            /// <summary>
            /// DataContractJson反序列化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="json"></param>
            /// <returns></returns>
            public T DeserializeDataContractJson<T>(string json)
            {
                DataContractJsonSerializer dataContractSerializer = new DataContractJsonSerializer(typeof(T));
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
                {
                    return (T)dataContractSerializer.ReadObject(ms);
                }
            }
            #endregion
    
            #region XmlSerializer序列化
            /// <summary>
            /// 将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您得以控制如何将对象编码到 XML 中。
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string SerializeXml(object value)
            {
                XmlSerializer serializer = new XmlSerializer(value.GetType());
                using (MemoryStream ms = new MemoryStream())
                {
                    serializer.Serialize(ms, value);
                    ms.Seek(0, SeekOrigin.Begin);
                    using (StreamReader sr = new StreamReader(ms))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            /// <summary>
            ///  XmlSerializer反序列化
            /// </summary>
            /// <param name="type"></param>
            /// <param name="str"></param>
            /// <returns></returns>
            public static object DeserializeXml(Type type, string str)
            {
                XmlSerializer serializer = new XmlSerializer(type);
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
                using (MemoryStream ms = new MemoryStream(bytes))
                {
                    return serializer.Deserialize(ms);
                }
            }
            #endregion
    
            #region BinaryFormatter序列化
            /// <summary>
            /// BinaryFormatter序列化
            /// 必须类型必须标记为Serializable
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string SerializeBinaryFormatter(object obj)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    formatter.Serialize(ms,obj);
                    byte[] bytes = ms.ToArray();
                    obj = formatter.Deserialize(new MemoryStream(bytes));
                    //如果是UTF8格式,则反序列化报错。可以用Default格式,不过,建议还是传参为byte数组比较好
                    return Encoding.Default.GetString(bytes);
                }
            }
    
            /// <summary>
            /// BinaryFormatter反序列化
            /// 必须类型必须标记为Serializable
            /// </summary>
            /// <param name="serializedStr"></param>
            /// <returns></returns>
            public static T DeserializeBinaryFormatter<T>(string serializedStr)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                byte[] bytes = Encoding.Default.GetBytes(serializedStr);
                using (MemoryStream ms = new MemoryStream(bytes))
                {
                    return (T)formatter.Deserialize(ms);
                }
            }
            #endregion 
    
            #region SoapFormatter序列化
            /// <summary>
            /// SoapFormatter序列化
            /// 必须类型必须标记为Serializable
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string SerializeSoapFormatter(object obj)
            {
                SoapFormatter formatter = new SoapFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    formatter.Serialize(ms, obj);
                    byte[] bytes = ms.ToArray();
                    return Encoding.UTF8.GetString(bytes);
                }
            }
            /// <summary>
            /// SoapFormatter反序列化
            /// 必须类型必须标记为Serializable
            /// </summary>
            /// <param name="serializedStr"></param>
            /// <returns></returns>
            public static T DeserializeSoapFormatter<T>(string serializedStr)
            {
                SoapFormatter formatter = new SoapFormatter();
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(serializedStr)))
                {
                    return (T)formatter.Deserialize(ms);
                }
            }
            #endregion
        }
    }
    View Code
  • 相关阅读:
    师生关系
    2019-2020 20191316《信息安全专业导论》第二周学习总结
    计算机科学概论问题2
    android studio device file explorer 无法向/storage/emulated/0/上传文件
    【转载】android打包APK
    android app no modules 错误,不能运行
    Error:Unable to locate adb within SDK in Android Studio
    Ubuntu set up 8
    Ubuntu 18.04.3 安装 CUDA 10.2
    Intel Realsense SDK for Android 编译
  • 原文地址:https://www.cnblogs.com/wanglao/p/3543193.html
Copyright © 2011-2022 走看看