必须填写至少10个字的日志
nnhy 编写于 2012-07-27 18:48:21
X
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace NewLife.Xml
{
    /// <summary>Xml实体基类</summary>
    /// <remarks>主要提供数据实体和XML文件之间的映射功能</remarks>
    public abstract class XmlEntity<TEntity> where TEntity : XmlEntity<TEntity>, new()
    {
        /// <summary>从一段XML文本中加载对象</summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static TEntity Load(String xml)
        {
            if (String.IsNullOrEmpty(xml)) return null;

            xml = xml.Trim();

            var serial = new XmlSerializer(typeof(TEntity));
            using (var reader = new StringReader(xml))
            {
                return (serial.Deserialize(reader) as TEntity);
            }
        }

        /// <summary>从一个XML文件中加载对象</summary>
        /// <param name="filename">若为空,则默认为类名加xml后缀</param>
        /// <returns></returns>
        public static TEntity LoadFile(String filename)
        {
            if (String.IsNullOrEmpty(filename)) filename = typeof(TEntity).Name + ".xml";
            if (!File.Exists(filename)) return new TEntity();

            var serial = new XmlSerializer(typeof(TEntity));
            using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new StreamReader(stream, Encoding.UTF8))
                {
                    return (serial.Deserialize(reader) as TEntity);
                }
            }
        }

        /// <summary>输出XML</summary>
        /// <returns></returns>
        public virtual String ToXml()
        {
            var serial = new XmlSerializer(typeof(TEntity));
            using (var stream = new MemoryStream())
            {
                var setting = new XmlWriterSettings();
                setting.Encoding = new UTF8Encoding(false);
                setting.Indent = true;
                using (var writer = XmlWriter.Create(stream, setting))
                {
                    // 去掉默认命名空间xmlns:xsd和xmlns:xsi
                    var xsns = new XmlSerializerNamespaces();
                    xsns.Add("", "");

                    serial.Serialize(writer, this, xsns);
                    return Encoding.UTF8.GetString(stream.ToArray());
                    //byte[] bts = stream.ToArray();
                    //String xml = Encoding.UTF8.GetString(bts);

                    //if (!String.IsNullOrEmpty(xml)) xml = xml.Trim();

                    //return xml;
                }
            }
        }

        /// <summary>输出Xml</summary>
        /// <returns></returns>
        public virtual String ToXml(String prefix, String ns)
        {
            var serial = new XmlSerializer(typeof(TEntity));
            using (var stream = new MemoryStream())
            {
                var setting = new XmlWriterSettings();
                setting.Encoding = new UTF8Encoding(false);
                setting.Indent = true;
                using (var writer = XmlWriter.Create(stream, setting))
                {
                    if (String.IsNullOrEmpty(ns))
                        serial.Serialize(writer, this);
                    else
                    {
                        var xsns = new XmlSerializerNamespaces();
                        xsns.Add(prefix, ns);
                        serial.Serialize(writer, this, xsns);
                    }
                    return Encoding.UTF8.GetString(stream.ToArray());
                }
            }
        }

        /// <summary>输出内部XML</summary>
        /// <returns></returns>
        public virtual String ToInnerXml()
        {
            var serial = new XmlSerializer(typeof(TEntity));
            using (var stream = new MemoryStream())
            {
                var setting = new XmlWriterSettings();
                setting.Encoding = new UTF8Encoding(false);
                setting.Indent = true;
                // 去掉开头 <?xml version="1.0" encoding="utf-8"?>
                setting.OmitXmlDeclaration = true;

                using (var writer = XmlWriter.Create(stream, setting))
                {
                    // 去掉默认命名空间xmlns:xsd和xmlns:xsi
                    var xsns = new XmlSerializerNamespaces();
                    xsns.Add("", "");

                    serial.Serialize(writer, this, xsns);
                    return Encoding.UTF8.GetString(stream.ToArray());
                }
            }
        }

        /// <summary>保存到文件中</summary>
        /// <param name="filename">若为空,则默认为类名加xml后缀</param>
        public virtual void Save(String filename)
        {
            //if (String.IsNullOrEmpty(filename)) return;
            if (String.IsNullOrEmpty(filename)) filename = typeof(TEntity).Name + ".xml";

            if (File.Exists(filename)) File.Delete(filename);
            var serial = new XmlSerializer(typeof(TEntity));
            using (var stream = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write))
            {
                using (var writer = new StreamWriter(stream, Encoding.UTF8))
                {
                    serial.Serialize((TextWriter)writer, this);
                }
            }
        }
    }
}