现在的位置: 首页 > 综合 > 正文

XML响应通用解释器

2013年06月09日 ⁄ 综合 ⁄ 共 1721字 ⁄ 字号 评论关闭

 /// <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!");
            }
        }
    }

抱歉!评论已关闭.