Exemple #1
0
        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;
                    }
                }
            }
        }