XML响应通用解释器

 /// <summary>
    /// XML响应通用解释器。
    /// </summary>
    public class XmlParser<T> : IParser<T> where T : Response
    {
        private static Regex regex = new Regex("<(http://www.cnblogs.com/luozhai714/admin/file://w/+?)[ >]", RegexOptions.Compiled);
        private static Hashtable parsers = Hashtable.Synchronized(new Hashtable());

        #region IParser<T> Members

        public T Parse(string body)
        {
            string rootTagName = GetRootElement(body);
            XmlSerializer serializer = parsers[rootTagName] as XmlSerializer;
            if (serializer == null)
            {
                XmlAttributes rootAttrs = new XmlAttributes();
                rootAttrs.XmlRoot = new XmlRootAttribute(rootTagName);

                XmlAttributeOverrides attrOvrs = new XmlAttributeOverrides();
                attrOvrs.Add(typeof(T), rootAttrs);

                serializer = new XmlSerializer(typeof(T), attrOvrs);
                // double check contain
                if (!parsers.ContainsKey(rootTagName))
                {
                    parsers.Add(rootTagName, serializer);
                }
            }

            object obj = null;
            using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(body)))
            {
                obj = serializer.Deserialize(stream);
            }

            T rsp = (T)obj;
            if (rsp != null)
            {
                rsp.Body = body;
            }
            return rsp;
        }

        #endregion

        /// <summary>
        /// 获取XML响应的根节点名称
        /// </summary>
        private string GetRootElement(string body)
        {
            Match match = regex.Match(body);
            if (match.Success)
            {
                return match.Groups[1].ToString();
            }
            else
            {
                throw new MyException("Invalid XML response format!");
            }
        }
    }

posted @ 2011-09-13 10:43  上海-天浩  阅读(218)  评论(1编辑  收藏  举报

Living in ShangHai

Copyright © 2008 天浩阁 Corporation, All Rights Reserved