using System; 
 | 
using System.Collections.Generic; 
 | 
using System.IO; 
 | 
using System.Text; 
 | 
using System.Text.RegularExpressions; 
 | 
using System.Xml.Serialization; 
 | 
using Top.Api; 
 | 
  
 | 
namespace Aliyun.Api.Parser 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// TOP XML响应通用解释器。 
 | 
    /// </summary> 
 | 
    public class AliyunXmlParser : IAliyunParser 
 | 
    { 
 | 
        private static readonly Regex regex = new Regex("<(\\w+?)[ >]", RegexOptions.Compiled); 
 | 
        private static readonly object writeLock = new object(); 
 | 
        private static readonly Dictionary<string, XmlSerializer> parsers = new Dictionary<string, XmlSerializer>(); 
 | 
  
 | 
        #region ITopParser Members 
 | 
  
 | 
        public T Parse<T>(string body) where T : AliyunResponse 
 | 
        { 
 | 
            Type type = typeof(T); 
 | 
            string rootTagName = GetRootElement(body); 
 | 
  
 | 
            string key = type.FullName; 
 | 
            if (Constants.ERROR_RESPONSE.Equals(rootTagName)) 
 | 
            { 
 | 
                key += ("_" + Constants.ERROR_RESPONSE); 
 | 
            } 
 | 
  
 | 
            XmlSerializer serializer = null; 
 | 
            bool incl = parsers.TryGetValue(key, out serializer); 
 | 
            if (!incl || serializer == null) 
 | 
            { 
 | 
                XmlAttributes rootAttrs = new XmlAttributes(); 
 | 
                rootAttrs.XmlRoot = new XmlRootAttribute(rootTagName); 
 | 
  
 | 
                XmlAttributeOverrides attrOvrs = new XmlAttributeOverrides(); 
 | 
                attrOvrs.Add(type, rootAttrs); 
 | 
  
 | 
                serializer = new XmlSerializer(type, attrOvrs); 
 | 
                lock (writeLock) 
 | 
                { 
 | 
                    parsers[key] = serializer; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            object obj = null; 
 | 
            using (System.IO.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 TopException("Invalid XML response format!"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |