protected virtual void ParseTree(EdiIntermediateEntity intermediateStructure) { foreach (EdiIntermediateEntity ent in intermediateStructure.Children) { switch (ent.EntityType) { case TokenContextType.Loop: SetMapContext(ent.Name); ParseTree(ent); break; case TokenContextType.Segment: SetMapContext(ent.Name); if (ent.Parent != null && !ent.Parent.Name.Equals(CurrentLoopDef.Name)) { ValidationError err = new ValidationError() { Message = $"Unexpected Segment at {ent.Parent.Name} > {ent.Name}." }; Trans.ValidationErrors.Add(err); } List <string> segParts = new List <string> { ent.Name }; segParts.AddRange(ent.Children.Select(el => el.ToString())); EdiSegment seg = ProcessSegment(CurrentEntityDef, segParts.ToArray(), -1, EdiInterchange.DefaultCompositeSeparator, Trans); CurrentLoopInstance.Content.Add(seg); break; } } }
protected override EdiIntermediateEntity ReadIntermediateTree(string rawData) { JsonTextReader reader = new JsonTextReader(new StringReader(rawData)); EdiIntermediateEntity context = new EdiIntermediateEntity(null); PropertyInfo prop = null; while (reader.Read()) { string val; switch (reader.TokenType) { case JsonToken.StartObject: var ent = new EdiIntermediateEntity(context); context?.Children.Add(ent); context = ent; break; case JsonToken.PropertyName: val = reader.Value.ToString(); prop = typeof(EdiIntermediateEntity).GetProperty(val); break; case JsonToken.String: val = reader.Value.ToString(); prop?.SetValue(context, val); break; case JsonToken.EndObject: context = context?.Parent; break; } } return(context?.Children[0]); }
private EdiIntermediateEntity CreateEntity(EdiIntermediateEntity parent, string type) { EdiIntermediateEntity ent = new EdiIntermediateEntity(parent) { Type = type }; parent?.Children.Add(ent); return(ent); }
public virtual EdiTrans ReadToEnd(string rawData) { Trans = new EdiTrans(CurrentLoopDef); CurrentLoopInstance = Trans; CurrentLoopInstance.Definition = CurrentLoopDef; EdiIntermediateEntity intermediateTree = ReadIntermediateTree(rawData); ParseTree(intermediateTree); return(Trans); }
protected override EdiIntermediateEntity ReadIntermediateTree(string rawData) { XmlTextReader reader = new XmlTextReader(new StringReader(rawData)); EdiIntermediateEntity context = new EdiIntermediateEntity(null); PropertyInfo prop = null; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: switch (reader.Name) { case "EdiTrans": context = CreateEntity(context, "M"); break; case "EdiLoop": context = CreateEntity(context, "L"); break; case "EdiSegment": context = CreateEntity(context, "S"); break; case "C": context = CreateEntity(context, "C"); break; case "E": context = CreateEntity(context, null); prop = typeof(EdiIntermediateEntity).GetProperty("E"); if (reader.IsEmptyElement) { context = context?.Parent; } break; case "Name": prop = typeof(EdiIntermediateEntity).GetProperty(reader.LocalName); break; } break; case XmlNodeType.Text: prop?.SetValue(context, reader.Value); break; case XmlNodeType.EndElement: switch (reader.Name) { case "EdiTrans": case "EdiLoop": case "EdiSegment": case "C": case "E": context = context?.Parent; break; case "Name": prop = null; break; } break; } } return(context?.Children[0]); }