首先上代码,这边是抽象类里面的基类实现方法:
public abstract class XmlConfigParser<TResult, TResource> : IConfigParser<TResult, TResource>
where TResource : Resource<TResult>
where TResult:class
{
public virtual TResult Parse(ref TResource resource)
{
Monitor.Watch("begin XmlConfigParse.");
TResult result = null;
XmlSerializer xs = new XmlSerializer(typeof (TResult));
result = xs.Deserialize(resource.Stream) as TResult;
resource.ParseLevel = Enum.ParseLevel.Detail;
resource.Stream.Close();
resource.Stream.Dispose();
resource.Stream = null;
Monitor.Watch("end XmlConfigParse.");
return result;
}
public virtual TResult ParseSchema(ref TResource resource)
{
return resource.Entity;
}
我这边用xmlwrite直接代替,虽然冗余但是速度的确快:
public class XmlReadQueryConfigParser : XmlQueryConfigParser
{
public override Query Parse(ref QueryResource resource)
{
Query query = new Query();
Monitor.Watch("begin XmlReadQueryConfigParser.");
using (XmlReader xmlReader = XmlReader.Create(resource.Stream))
{
var propertyIndex = 0;
var dataQueryIndex = 0;
while (xmlReader.Read())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
if ("Formatter".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
Formatter formatter = new Entity.Formatter()
{
Id = xmlReader.GetAttribute("Id"),
Ref = xmlReader.GetAttribute("Ref"),
Class = xmlReader.GetAttribute("Class"),
CreateType =
xmlReader.GetAttribute("Type") == FormatterCreateType.ByClass.ToString()
? FormatterCreateType.ByClass
: xmlReader.GetAttribute("Type") ==
FormatterCreateType.ByRef.ToString()
? FormatterCreateType.ByRef
: FormatterCreateType.NULL
};
query.Formatters.Add(formatter);
propertyIndex++;
}
else if (("Property").Equals(xmlReader.Name))
{
query.Formatters[propertyIndex - 1].Propertys.Add(new Entity.FormatterProperty
{
Name = xmlReader.GetAttribute("Name"),
Value = xmlReader.GetAttribute("Value")
});
}
else if ("DataQuery".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys.Add(new Entity.DataQuery()
{
Id = xmlReader.GetAttribute("Id"),
CacheCount = Convert.ToBoolean(xmlReader.GetAttribute("CacheCount")),
CacheCountSecond = Convert.ToInt32(xmlReader.GetAttribute("CacheCountSecond")),
CountSqlConstructorType = xmlReader.GetAttribute("CountSqlType") == CountSqlConstructorType.Auto.ToString() ?
CountSqlConstructorType.Auto : xmlReader.GetAttribute("CountSqlType") == CountSqlConstructorType.Basic.ToString() ?
CountSqlConstructorType.Basic : xmlReader.GetAttribute("CountSqlType") == CountSqlConstructorType.Custom.ToString() ?
CountSqlConstructorType.Custom : CountSqlConstructorType.NULL
});
dataQueryIndex++;
}
else if ("Argument".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].Arguments.Add(new Entity.Argument()
{
Name = xmlReader.GetAttribute("Name"),
Required = Convert.ToBoolean(xmlReader.GetAttribute("Required")),
ValueConvertType = xmlReader.GetAttribute("ValueConvertType") == ValueConvertType.Formatter.ToString() ?
ValueConvertType.Formatter : xmlReader.GetAttribute("ValueConvertType") == ValueConvertType.Dictionary.ToString() ?
ValueConvertType.Dictionary : ValueConvertType.NULL,
ValidationType= xmlReader.GetAttribute("ValueConvertType")==ValidationType.Regex.ToString()?
ValidationType.Regex:ValidationType.None
});
}
else if ("Condition".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].Conditions.Add(new Entity.Condition()
{
Field = xmlReader.GetAttribute("Field"),
Name = xmlReader.GetAttribute("Name"),
Label = xmlReader.GetAttribute("Label"),
ConditionType = xmlReader.GetAttribute("ConditionType") == ConditionType.BETWEEN.ToString() ?
ConditionType.BETWEEN : xmlReader.GetAttribute("ConditionType") == ConditionType.EQ.ToString() ?
ConditionType.EQ : xmlReader.GetAttribute("ConditionType") == ConditionType.GTE.ToString() ?
ConditionType.GTE : xmlReader.GetAttribute("ConditionType") == ConditionType.LIKE.ToString() ?
ConditionType.LIKE : xmlReader.GetAttribute("ConditionType") == ConditionType.GT.ToString() ?
ConditionType.GT : xmlReader.GetAttribute("ConditionType") == ConditionType.IN.ToString() ?
ConditionType.IN : xmlReader.GetAttribute("ConditionType") == ConditionType.ISNOTNULL.ToString() ?
ConditionType.ISNOTNULL : xmlReader.GetAttribute("ConditionType") == ConditionType.ISNULL.ToString() ?
ConditionType.ISNULL : xmlReader.GetAttribute("ConditionType") == ConditionType.LT.ToString() ?
ConditionType.LT : xmlReader.GetAttribute("ConditionType") == ConditionType.LTE.ToString() ?
ConditionType.LTE : xmlReader.GetAttribute("ConditionType") == ConditionType.NOTIN.ToString() ? ConditionType.NOTIN : ConditionType.NULL,
ShowType = xmlReader.GetAttribute("ShowType"),
ShowCallBack = xmlReader.GetAttribute("ShowCallBack"),
DefaultValue = xmlReader.GetAttribute("DefaultValue"),
FieldDataType = xmlReader.GetAttribute("FieldDataType") == FieldDataType.VarChar.ToString() ?
FieldDataType.VarChar : xmlReader.GetAttribute("FieldDataType") == FieldDataType.Bit.ToString() ?
FieldDataType.Bit : xmlReader.GetAttribute("FieldDataType") == FieldDataType.DateTime.ToString() ?
FieldDataType.DateTime : xmlReader.GetAttribute("FieldDataType") == FieldDataType.Decimal.ToString() ?
FieldDataType.Decimal : xmlReader.GetAttribute("FieldDataType") == FieldDataType.Int.ToString() ?
FieldDataType.Int : xmlReader.GetAttribute("FieldDataType") == FieldDataType.NChar.ToString() ?
FieldDataType.NChar : xmlReader.GetAttribute("FieldDataType") == FieldDataType.NVarChar.ToString() ?
FieldDataType.NVarChar : xmlReader.GetAttribute("FieldDataType") == FieldDataType.NText.ToString() ?
FieldDataType.NText : xmlReader.GetAttribute("FieldDataType") == FieldDataType.Char.ToString() ?
FieldDataType.Char : xmlReader.GetAttribute("FieldDataType") == FieldDataType.Text.ToString() ?
FieldDataType.Text : xmlReader.GetAttribute("FieldDataType") == FieldDataType.UniqueIdentifier.ToString() ?
FieldDataType.UniqueIdentifier : FieldDataType.NULL,
DbType = Convert.ToInt32(xmlReader.GetAttribute("DbType")),
Size = Convert.ToInt32(xmlReader.GetAttribute("Size")),
ValidationType = xmlReader.GetAttribute("ValidationType") == Com.Centaline.Framework.QuickQuery.Config.Enum.ValidationType.Regex.ToString() ?
Com.Centaline.Framework.QuickQuery.Config.Enum.ValidationType.Regex : ValidationType.None,
});
}
else if ("CountSql".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].QuerySentence.CountSql = xmlReader.ReadString();
}
else if ("BaseSql".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].QuerySentence.BaseSql = xmlReader.ReadString();
}
else if ("GroupSql".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].QuerySentence.GroupSql = xmlReader.ReadString();
}
else if ("OrderBySql".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].QuerySentence.OrderBySql = xmlReader.ReadString();
}
else if ("WhereSql".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].QuerySentence.WhereSql = xmlReader.ReadString();
}
else if ("Column".Equals(xmlReader.Name, StringComparison.CurrentCulture))
{
query.DataQuerys[dataQueryIndex - 1].Grid.Columns.Add(new Entity.Column()
{
Name = xmlReader.GetAttribute("Name"),
Type = xmlReader.GetAttribute("Type") == ColumnType.Both.ToString() ?
ColumnType.Both : xmlReader.GetAttribute("Type") == ColumnType.Virtual.ToString() ?
ColumnType.Virtual : xmlReader.GetAttribute("Type") == ColumnType.JoinQuery.ToString() ?
ColumnType.JoinQuery : xmlReader.GetAttribute("Type") == ColumnType.JoinQuickQuery.ToString() ?
ColumnType.JoinQuickQuery : xmlReader.GetAttribute("Type") == ColumnType.Search.ToString() ?
ColumnType.Search : xmlReader.GetAttribute("Type") == ColumnType.Show.ToString() ?
ColumnType.Show : ColumnType.NULL,
Format = xmlReader.GetAttribute("Format"),
IsSort = Convert.ToBoolean(xmlReader.GetAttribute("IsSort")),
Order= xmlReader.GetAttribute("Order"),
ReferenceColumn = xmlReader.GetAttribute("ReferenceColumn"),
Index = xmlReader.GetAttribute("Index"),
ValueConvertType = xmlReader.GetAttribute("ValueConvertType") == ValueConvertType.Formatter.ToString() ?
ValueConvertType.Formatter : xmlReader.GetAttribute("ValueConvertType") == ValueConvertType.Dictionary.ToString() ?
ValueConvertType.Dictionary : ValueConvertType.NULL,
ValueConverter = xmlReader.GetAttribute("ValueConverter"),
Field =xmlReader.GetAttribute("Field"),
Title = xmlReader.GetAttribute("Title"),
FieldType = xmlReader.GetAttribute("FieldType"),
QuickQueryId = xmlReader.GetAttribute("QuickQueryId"),
VirtualColumnDataSourceType = xmlReader.GetAttribute("VirtualColumnDataSourceType") == VirtualColumnDataSourceType.Column.ToString() ?
VirtualColumnDataSourceType.Column : xmlReader.GetAttribute("VirtualColumnDataSourceType") == VirtualColumnDataSourceType.Result.ToString() ?
VirtualColumnDataSourceType.Result : xmlReader.GetAttribute("VirtualColumnDataSourceType") == VirtualColumnDataSourceType.Row.ToString() ?
VirtualColumnDataSourceType.Row : VirtualColumnDataSourceType.NULL
});
}
break;
default:
break;
}
}
Monitor.Watch("end XmlReadQueryConfigParser.");
resource.Stream.Close();
resource.Stream.Dispose();
resource.Stream = null;
return query;
}
}
}