protected ReadContext ReadNodeProcess(string filePath, string nodeName) { FileStream stream = new FileStream(filePath, FileMode.Open); System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(stream); ReadArgs readArgs = null; ReadContext context = new ReadContext(); bool readIsFinish = false; if (nodeName == null) { reader.Read(); } else { reader.ReadToFollowing(nodeName); } do { int nowDepth = reader.Depth; switch (reader.NodeType) { case System.Xml.XmlNodeType.Element: ConsoleLog.WriteLine(System.Xml.XmlNodeType.Element + "-" + reader.Name); //该条件成立时,判定读取节点为GroupNode if (context.PreviousNodeType == System.Xml.XmlNodeType.Element) { readArgs.Type = XmlNodeType.Group; ReadSingleNodeStart?.Invoke(context, readArgs); if (reader.Depth == context.PreviousDepth && readArgs.Name == nodeName) { readIsFinish = true; context.PopParentNode(); break; } } readArgs = new ReadArgs(); context.NodeIsEnd = ReadElement(reader, readArgs, context); context.PreviousNodeType = System.Xml.XmlNodeType.Element; context.PreviousDepth = nowDepth; break; case System.Xml.XmlNodeType.Text: ConsoleLog.WriteLine(System.Xml.XmlNodeType.Text + "-" + reader.Name); //判定当前节点为ContentNode readArgs.Type = XmlNodeType.Content; ReadSingleNodeStart?.Invoke(context, readArgs); context.NodeIsEnd = ReadText(reader, readArgs, context); context.PreviousNodeType = System.Xml.XmlNodeType.Text; context.PreviousDepth = nowDepth; break; case System.Xml.XmlNodeType.EndElement: ConsoleLog.WriteLine(System.Xml.XmlNodeType.EndElement + "-" + reader.Name); //当条件成立时,判定节点为GroupNode if (context.PreviousNodeType == System.Xml.XmlNodeType.Element) { readArgs.Type = XmlNodeType.Group; ReadSingleNodeStart?.Invoke(context, readArgs); } context.NodeIsEnd = ReadEndElement(reader, readArgs, context); ReadSingleNodeEnd?.Invoke(context, readArgs); if (reader.Name == nodeName) { readIsFinish = true; } readArgs = new ReadArgs(); context.PreviousNodeType = System.Xml.XmlNodeType.EndElement; context.PreviousDepth = nowDepth; break; } if (readIsFinish) { break; } }while (reader.Read()); reader.Close(); return(context); }
/// <summary> /// 读取节点结束标记,返回值恒为false /// </summary> /// <param name="reader">代表节点读取是否完成</param> /// <param name="readArgs">代表读取到的一些参数</param> /// <param name="context">代表读取过程中的上下文环境,例如包括父节点</param> /// <returns></returns> protected bool ReadEndElement(System.Xml.XmlTextReader reader, ReadArgs readArgs, ReadContext context) { context.PopParentNode(); return(true); }