private void ParseDataSet(long StreamPositionEnd, XElement theParentNode) { // Each Sequence does have it's own 'Private Code Dictionary' PrivateCodeDictionary aPrivateCodeDictionary = new PrivateCodeDictionary(); while (mBinaryReader.BaseStream.Position < StreamPositionEnd) { DICOMDataElement aTag = GetNextTag(aPrivateCodeDictionary); if (aTag != null) { // Check for 'Transfer Syntax UID (0002,0010)' // =========================================== if (aTag.Tag.Equals("(0002,0010)")) { mTransferSyntax = aTag.ValueField; } // Private Creator Code Handling // ============================= // Reset Private Creator Code List if current Tag is 'Item' if (aTag.Tag.Equals("(FFFE,E000)")) { aPrivateCodeDictionary.ClearPrivateCreatorCode(); } // Add new Private Creator Code if ((aTag.GroupNumber % 2) == 1 && (aTag.ElementNumber <= 0xFF)) { string aGroupNumberString = aTag.GroupNumber.ToString("X4"); string aElementNumberString = aTag.ElementNumber.ToString("X2"); aPrivateCodeDictionary.LoadPrivateCreatorCode(aGroupNumberString, aElementNumberString, aTag.ValueField.Trim()); } // Add new Tag to XDocument // ======================== XElement newXDataElement = new XElement("DataElement"); theParentNode.Add(newXDataElement); newXDataElement.Add(new XAttribute("Tag", aTag.Tag)); newXDataElement.Add(new XAttribute("TagName", aTag.TagName)); newXDataElement.Add(new XAttribute("VR", aTag.VR)); newXDataElement.Add(new XAttribute("VM", aTag.VM)); newXDataElement.Add(new XAttribute("Data", aTag.ValueField)); newXDataElement.Add(new XAttribute("Length", aTag.ValueLength.ToString())); newXDataElement.Add(new XAttribute("StreamPosition", aTag.StreamPosition.ToString())); // Call 'ParseDataSet' recursively for nested datasets // =================================================== if (aTag.VR.Equals("SQ")) { if (aTag.ValueLength == -1) { ParseDataSet(mBinaryReader.BaseStream.Length, newXDataElement); } else { ParseDataSet(mBinaryReader.BaseStream.Position + aTag.ValueLength, newXDataElement); } } // End criteria for sequence reached? // ================================== // Break if current Tag is 'Sequence Delimitation Item' if (aTag.Tag.Equals("(FFFE,E0DD)")) { break; } } } }