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