C#生成、解析xml文件以及处理报错原因

               简单的介绍一下生成XML文件以及解析,因为有些数据不一定放到数据库,减少链接数据库

       用xml还是比较好些。如果遇到问题也就是解析时报错,对于解析,可以选择用ie浏览器进行验证

       是否符合xml格式,不能显示说明不正确,用记事本打开看也没有发现啥情况,复制出来到别的xml

       文件里,运行可能正确,那就说明生成的xml编码有问题。还有就是节点有什么空格啥的。

                 

               Load和LoadXml方法的区别?

               Load方法可以解析包括xml的头部文件“<?xml version="1.0" encoding="utf-8"?>”,而LoadXml

        方法不能解析,会报错,它只能解析如:<Resources><Guid>647e7d54-321c-4bca-ac10-301de2837d9d

        </Guid><Name>中国案件4</Name></Resources>文件,不能包含xml的头部文件。

      

        1.序列化类:

        /// <summary>
        /// 序列化成XML
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string XmlSerialize(object o)
        {
            XmlSerializer ser = new XmlSerializer(o.GetType());
            System.IO.MemoryStream mem = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8); 
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ser.Serialize(writer, o, ns);
            writer.Close();
            return Encoding.UTF8.GetString(mem.ToArray());
        }


        /// <summary>
        /// 解析成XML
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="s"></param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(string s)
        {
            XmlDocument xdoc = new XmlDocument();
            try
            {
                xdoc.Load(s);
                XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
                XmlSerializer ser = new XmlSerializer(typeof(T));
                object obj = ser.Deserialize(reader);
                return (T)obj;
            }
            catch
            {
                return default(T);
            }
        }


        /// <summary>
        /// 解析成XML,不能解析包含头部文件<?xml version="1.0" encoding="utf-8"?>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="s"></param>
        /// <returns></returns>
        public static T LoadXmlDeserialize<T>(string s)
        {
            XmlDocument xdoc = new XmlDocument();
            try
            {
                xdoc.LoadXml(s);
                XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
                XmlSerializer ser = new XmlSerializer(typeof(T));
                object obj = ser.Deserialize(reader);
                return (T)obj;
            }
            catch
            {
                return default(T);
            }
        }

 

     2.//Resources类
     public class Resources
     {
        public Guid Guid { get; set; }
        public string Name { get; set; }
     }

 

     3.//生成xml

      public void CreateXml(List<Resources> _list, string path)
        {
            var xml = SerializerHelper.XmlSerialize(_list).Trim();//这个地方也需要去除空格,不然也会报错,错误跟下面的一样。

            // using (StreamWriter sw = new StreamWriter(path, false,Encoding.UTF8))这个生成的xml看着是没有问题

               但是网页IE不能解析,说明有问题,直接去掉Encoding.UTF8即可,不然报错“根级别上的数据无效”
            using (StreamWriter sw = new StreamWriter(path, false))
            {
                sw.Write(xml);
            }
        }

    

     4.//解析XML,指定文件路径,判断文件夹是否存在以及查找文件名

            DirectoryInfo di = new DirectoryInfo("Xml");
            if (!di.Exists)
            {
                Directory.CreateDirectory("Xml");
            }
            if (di.GetFiles().Length > 0)
            {

                foreach (FileInfo fi in di.GetFiles())
                {
                    if (fi.Name.Contains("Resource.xml"))
                    {
                        var list = SerializerHelper.XmlDeserialize<List<Resources>>("Xml/Resource.xml");
                        if (list.Count > 0)
                        {
                            
                        }

                    }
                }

            }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低调之人

略表心意,哈哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值