Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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]);
        }
Пример #3
0
        private EdiIntermediateEntity CreateEntity(EdiIntermediateEntity parent, string type)
        {
            EdiIntermediateEntity ent = new EdiIntermediateEntity(parent)
            {
                Type = type
            };

            parent?.Children.Add(ent);
            return(ent);
        }
Пример #4
0
        public virtual EdiTrans ReadToEnd(string rawData)
        {
            Trans = new EdiTrans(CurrentLoopDef);

            CurrentLoopInstance            = Trans;
            CurrentLoopInstance.Definition = CurrentLoopDef;

            EdiIntermediateEntity intermediateTree = ReadIntermediateTree(rawData);

            ParseTree(intermediateTree);

            return(Trans);
        }
Пример #5
0
        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]);
        }