[size=10px]
#region // 解析任务文件
public static Hashtable ParseQusetXmlFile(String file)
{
QuestInfos.Clear(); try
{
// 解析任务
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(file); XmlNode xmlRootNode = xmlDoc.SelectSingleNode("quests");
XmlNodeList xmlQuests = xmlRootNode.ChildNodes; foreach (XmlNode xmlQuestNode in xmlQuests)
{
QuestInfo questInfo = ParseQusetInfoImpl(xmlQuestNode);
try
{
QuestInfos.Add(questInfo.Id.ToString(), questInfo);
}
catch (System.Exception)
{
Logger.LogFunctionError("QuestXmlReader.QuestInfo.ClearEvent()", "Id=" + questInfo.Id.ToString() + " Name=" + questInfo.Name);
}
}   // end foreach (XmlNode xmlQuestNode in xmlQuests)
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetXmlFile()[Tag_解析任务]", ex.Message);
return null;
} return QuestInfos;
}
private static QuestInfo ParseQusetInfoImpl(XmlNode xmlQuestNode)
{
QuestInfo questInfo = new QuestInfo(); try
{
XmlElement xmlQuestAttribute = (XmlElement)xmlQuestNode;
questInfo.Id = Convert.ToInt32(xmlQuestAttribute.GetAttribute("id"));
questInfo.Name = xmlQuestAttribute.GetAttribute("name").Trim();
XmlNodeList xmlQuestInfos = xmlQuestAttribute.ChildNodes; try
{
#region // 解析任务描述及事件回调
foreach (XmlNode xmlQuestInfo in xmlQuestInfos)
{
if (xmlQuestInfo.NodeType == XmlNodeType.Element)
{
switch (xmlQuestInfo.Name)
{
case "description":
#region // 任务描述
try
{
XmlNodeList xmlDescriptionInfos = xmlQuestInfo.ChildNodes; foreach (XmlNode xmlDescriptionInfo in xmlDescriptionInfos)
{
if (xmlDescriptionInfo.NodeType == XmlNodeType.Element)
{
try
{
switch (xmlDescriptionInfo.Name)
{
case "body":
// 对应<p></p>、<diffcult />、<message></message>
XmlNodeList level1BodyNodes = xmlDescriptionInfo.ChildNodes;
// 解析<p><n></n></p>
StringBuilder pnTags = new StringBuilder(); foreach (XmlNode level1BodyNode in level1BodyNodes)
{
if (level1BodyNode.NodeType == XmlNodeType.Element)
{
try
{
#region // 解析<body>节点
switch (level1BodyNode.Name)
{
case "p":
#region // 解析<p>节点
XmlNodeList nNodes = level1BodyNode.ChildNodes;
foreach (XmlNode nNode in nNodes)
{
if (nNode.NodeType == XmlNodeType.Element)
{
try
{
switch (nNode.Name)
{
case "n":
try
{
if (1 == nNode.Attributes.Count)
pnTags.Append("<n color=\"" + nNode.Attributes[0].Value + "\">" + nNode.InnerXml + "</n>");
else if (2 == nNode.Attributes.Count)
pnTags.Append("<n var=\"" + nNode.Attributes["var"].Value + 
"\" task=\"" + nNode.Attributes["task"].Value + "\">" + nNode.InnerXml + "</n>");
else
pnTags.Append("<n>" + nNode.InnerXml + "</n>");
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_n]", ex.Message);
}
break;
case "a":
try
{
pnTags.Append("<a href=\"" + nNode.Attributes[0].Value + "\">" + nNode.InnerXml + "</a>");
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_a]", ex.Message);
}
break;
default:
break;
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_p]", ex.Message);
}
}
}
pnTags.Append("\n");
#endregion
break;
case "diffcult":    // 注:这里不是拼写错误
#region // 解析<diffcult>节点
try
{
if (1 == level1BodyNode.Attributes.Count)
questInfo.UserDescription.DiffcultLevel = Convert.ToInt32(level1BodyNode.Attributes[0].Value);
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_diffcult]", ex.Message);
}
#endregion
break;
case "message":
#region // 解析<message>节点
XmlNodeList mnNodes = level1BodyNode.ChildNodes;
StringBuilder mnTags = new StringBuilder();
foreach (XmlNode mnNode in mnNodes)
{
if (mnNode.NodeType == XmlNodeType.Element)
{
try
{
switch (mnNode.Name)
{
case "n":
try
{
if (1 == mnNode.Attributes.Count)
mnTags.Append("<n color=\"" + mnNode.Attributes[0].Value + "\">" + mnNode.InnerXml + "</n>");
else if (2 == mnNode.Attributes.Count)
mnTags.Append("<n var=\"" + mnNode.Attributes["var"].Value + 
"\" task=\"" + mnNode.Attributes["task"].Value + "\">" + mnNode.InnerXml + "</n>");
else
mnTags.Append("<n>" + mnNode.InnerXml + "</n>");
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_message]", ex.Message);
}
break;
default:
break;
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_解析<message>节点]", ex.Message);
}
}
}
questInfo.UserDescription.Messages.Add(mnTags.ToString());
#endregion
break;
default:
break;
}
#endregion
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_解析<body>节点]", ex.Message);
}
}
}
questInfo.UserDescription.Description = pnTags.ToString();
break;
default:
break;
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag5]", ex.Message);
}
}
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag4]", ex.Message);
}
break;
#endregion
case "events":
#region // 事件回调
XmlNodeList xmlEnentsInfo = xmlQuestInfo.ChildNodes;
foreach (XmlNode xmlEnentInfo in xmlEnentsInfo)
{
if (xmlEnentInfo.NodeType == XmlNodeType.Element)
{
try
{
switch (xmlEnentInfo.Name)
{
case "event":
String eventType = ((XmlElement)xmlEnentInfo).GetAttribute("type");
String eventSource = ((XmlElement)xmlEnentInfo).GetAttribute("source");
questInfo.SetEvent(eventType);
((QuestInfo.EventList)questInfo.EventsTable[eventType]).Events.Add(eventSource);
break;
default:
break;
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[event]", ex.Message);
}
}
}
break;
#endregion
default:
break;
}
}
}
#endregion
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_解析任务描述及事件回调]", ex.Message);
}
}
catch (System.Exception ex)
{
Logger.LogFunctionError("QuestXmlHandler.ParseQusetInfo()[Tag_xmlQuestAttribute]", ex.Message);
return null;
} return questInfo;
}
#endregion
[/size]