Beispiel #1
0
        private XElement Map(MapState mapState, Loop loop)
        {
            var    xml = new XElement(loop.Id);
            string previousSegmentId = null;
            var    loopState         = new MapState.LoopState(loop);

            mapState.LoopStates.Push(loopState);
            while (mapState.SegmentIndex < mapState.Segments.Count)
            {
                EdiSegment segment = mapState.Segments[mapState.SegmentIndex];
                if (loopState.VisitedSegmentIds.Contains(segment.Id))
                {
                    break;
                }
                Node mapping = loop.FindMatchingNode(segment);
                if (mapping == null && SegmentWasUnvisitedInOuterLoops(segment, mapState))
                {
                    break;
                }
                if (mapping is Loop)
                {
                    xml.Add(Map(mapState, (Loop)mapping));
                }
                else
                {
                    xml.Add(MapSegment(segment, (Segment)mapping));
                    mapState.SegmentIndex++;
                }
                if (previousSegmentId == null)
                {
                    if (loop != _root)
                    {
                        loopState.VisitedSegmentIds.Add(segment.Id);
                    }
                }
                else if (previousSegmentId != segment.Id)
                {
                    loopState.VisitedSegmentIds.Add(previousSegmentId);
                }
                previousSegmentId = segment.Id;
            }
            mapState.LoopStates.Pop();
            return(xml);
        }
Beispiel #2
0
 private XElement Map(MapState mapState, Loop loop)
 {
     var xml = new XElement(loop.Id);
     string previousSegmentId = null;
     var loopState = new MapState.LoopState(loop);
     mapState.LoopStates.Push(loopState);
     while (mapState.SegmentIndex < mapState.Segments.Count)
     {
         EdiSegment segment = mapState.Segments[mapState.SegmentIndex];
         if (loopState.VisitedSegmentIds.Contains(segment.Id))
             break;
         Node mapping = loop.FindMatchingNode(segment);
         if (mapping == null && SegmentWasUnvisitedInOuterLoops(segment, mapState))
             break;
         if (mapping is Loop)
             xml.Add(Map(mapState, (Loop) mapping));
         else
         {
             xml.Add(MapSegment(segment, (Segment) mapping));
             mapState.SegmentIndex++;
         }
         if (previousSegmentId == null)
         {
             if (loop != _root)
                 loopState.VisitedSegmentIds.Add(segment.Id);
         }
         else if (previousSegmentId != segment.Id)
             loopState.VisitedSegmentIds.Add(previousSegmentId);
         previousSegmentId = segment.Id;
     }
     mapState.LoopStates.Pop();
     return xml;
 }