Ejemplo n.º 1
0
        /// <summary>
        /// Parses the data.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xmlContent">Content of the XML.</param>
        /// <returns>List{``0}.</returns>
        protected List <T> ParseData <T>(string xmlContent) where T : class
        {
            var res  = new List <T>();
            var type = typeof(T);

#if DEBUG
            Console.WriteLine("Real-time processing {0}, thread: {1}", type, Thread.CurrentThread.Name);
#endif
            var attribute = XmlEntityUtility.GetXmlEntityHandlerAttribute(type);
            var result    = attribute.EntityParser.Invoke(xmlContent, type);
            var flag      = XmlEntityUtility.GetXmlEntityAttribute(type).XmlEntityFlag;
            var isSingle  = false;
            switch (flag)
            {
            case XmlEntityFlags.Base:
            case XmlEntityFlags.Nested:
            case XmlEntityFlags.Single | XmlEntityFlags.Base:
            case XmlEntityFlags.Single | XmlEntityFlags.Nested:
            case XmlEntityFlags.Nested | XmlEntityFlags.Base | XmlEntityFlags.Single:
                isSingle = true;
                break;
            }
            //判断是否实体集
            if (!isSingle)
            {
                var items = result as object[];
                if (items != null)
                {
                    foreach (var item in items)
                    {
                        res.Add(item as T);
                    }
                }
                //尝试设置缓存
                SetCache <T>(res);
                return(res);
            }
            res.Add(result as T);
            //尝试设置缓存
            SetCache <T>(res);
            return(res);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Parses the specified XML content.
        /// </summary>
        /// <param name="xmlContent">Content of the XML.</param>
        /// <param name="entityType">Type of the entity.</param>
        /// <returns>List{``0}.</returns>
        /// <exception cref="System.Xml.XmlException">无效的Xml格式, + ex.Message</exception>
        public virtual object Parse(string xmlContent, Type entityType)
        {
            var xmlDoc = new XmlDocument();

            try
            {
                //移除命名空间
                xmlContent = Regex.Replace(xmlContent, @"(xmlns:?[^=]*=[""][^""]*[""])", string.Empty,
                                           RegexOptions.IgnoreCase | RegexOptions.Multiline);
                xmlDoc.LoadXml(xmlContent);
            }
            catch (Exception ex)
            {
                throw new XmlException("无效的Xml格式," + ex.Message);
            }
            var xmlEntityAttribute = XmlEntityUtility.GetXmlEntityAttribute(entityType);

            switch (xmlEntityAttribute.XmlEntityFlag)
            {
            case XmlEntityFlags.Base | XmlEntityFlags.Multiple:
            case XmlEntityFlags.Base | XmlEntityFlags.Nested | XmlEntityFlags.Multiple:
            case XmlEntityFlags.Nested | XmlEntityFlags.Multiple:
                //提取节点列表
                return(Parse(xmlDoc, xmlEntityAttribute.XPath, entityType));

            case XmlEntityFlags.Base:
            case XmlEntityFlags.Base | XmlEntityFlags.Single:
            case XmlEntityFlags.Nested:
            case XmlEntityFlags.Nested | XmlEntityFlags.Single:
            case XmlEntityFlags.Base | XmlEntityFlags.Nested | XmlEntityFlags.Single:
                //提取单个节点
                var xmlNode = xmlDoc.SelectSingleNode(xmlEntityAttribute.XPath);
                return(xmlNode == null ? null : Parse(xmlNode, entityType));
            }
            return(null);
        }