/// <summary> Populates the given group object with data from the given group element, ignoring /// any unrecognized nodes. /// </summary> private void Parse(IGroup groupObject, XmlElement groupElement) { var childNames = groupObject.Names; var messageName = groupObject.Message.GetStructureName(); var allChildNodes = groupElement.ChildNodes; var unparsedElementList = new ArrayList(); for (var i = 0; i < allChildNodes.Count; i++) { var node = allChildNodes.Item(i); var name = node.Name; if (Convert.ToInt16(node.NodeType) == (short)XmlNodeType.Element && !unparsedElementList.Contains(name)) { unparsedElementList.Add(name); } } // we're not too fussy about order here (all occurrences get parsed as repetitions) ... for (var i = 0; i < childNames.Length; i++) { SupportClass.ICollectionSupport.Remove(unparsedElementList, childNames[i]); ParseReps(groupElement, groupObject, messageName, childNames[i], childNames[i]); } for (var i = 0; i < unparsedElementList.Count; i++) { var segName = (string)unparsedElementList[i]; var segIndexName = groupObject.AddNonstandardSegment(segName); ParseReps(groupElement, groupObject, messageName, segName, segIndexName); } }
// param childIndexName may have an integer on the end if >1 sibling with same name (e.g. NTE2) private void ParseReps( XmlElement groupElement, IGroup groupObject, string messageName, string childName, string childIndexName) { var reps = GetChildElementsByTagName(groupElement, MakeGroupElementName(messageName, childName)); Log.Debug("# of elements matching " + MakeGroupElementName(messageName, childName) + ": " + reps.Count); if (groupObject.IsRepeating(childIndexName)) { for (var i = 0; i < reps.Count; i++) { ParseRep((XmlElement)reps[i], groupObject.GetStructure(childIndexName, i)); } } else { if (reps.Count > 0) { ParseRep((XmlElement)reps[0], groupObject.GetStructure(childIndexName, 0)); } if (reps.Count > 1) { var newIndexName = groupObject.AddNonstandardSegment(childName); for (var i = 1; i < reps.Count; i++) { ParseRep((XmlElement)reps[i], groupObject.GetStructure(newIndexName, i - 1)); } } } }
/// <summary> Sets the next position to a new segment of the given name, within the /// given group. /// </summary> private void NewSegment(IGroup parent, string name) { Log.Info("MessageIterator creating new segment: " + name); parent.AddNonstandardSegment(name); nextRenamedField = new Position(parent, parent.Names[parent.Names.Length - 1], 0); }