System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartElement C# (CSharp) Метод

StartElement() приватный Метод

private StartElement ( String prefix, String name, String urn ) : void
prefix String
name String
urn String
Результат void
        internal void StartElement(String prefix, String name, String urn)
        {
#if _DEBUG
            InternalST.Soap( this,SerTraceString("StartElement Begin ", (ParseRecord)stack.Peek(), name, prefix, urn, currentState, headerState));
#endif
            String actualName = NameFilter(name);
            String actualPrefix = prefix;

            ParseRecord pr = null;

            if (!((urn == null) || (urn.Length == 0)) && ((prefix == null) || (prefix.Length == 0)))
            {
                // Need to assign a prefix to the urn
                if (nameSpaceToKey.ContainsKey(urn))
                    actualPrefix = (String)nameSpaceToKey[urn];
                else
                {
                    actualPrefix = NextPrefix();
                    nameSpaceToKey[urn] = actualPrefix;
                }
                InternalST.Soap( this,"StartElement Begin null urn assigned prefix ", actualPrefix);
            }


            switch (currentState)
            {
                case InternalParseStateE.Object:
                    pr = GetPr();
                    pr.PRname = actualName;
                    pr.PRnameXmlKey = actualPrefix;
                    pr.PRxmlNameSpace = urn;
                    pr.PRparseStateEnum = InternalParseStateE.Object;

                    if ((String.Compare(name, "Array", StringComparison.OrdinalIgnoreCase ) == 0) && actualPrefix.Equals(soapKey))
                        pr.PRparseTypeEnum = InternalParseTypeE.Object;
                    else if (((String.Compare(name, "anyType", StringComparison.OrdinalIgnoreCase ) == 0) || (String.Compare(name, "ur-type", StringComparison.OrdinalIgnoreCase ) == 0)) && actualPrefix.Equals(xsdKey))
                    {
                        pr.PRname = "System.Object";
                        pr.PRnameXmlKey = urtKey;
                        pr.PRxmlNameSpace = urn;                        
                        pr.PRparseTypeEnum = InternalParseTypeE.Object;
                    }
                    else if (String.Compare(urn, "http://schemas.xmlsoap.org/soap/envelope/", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        if (String.Compare(name, "Envelope", StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            if (isEnvelope)
                                throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_Parser_Envelope"),prefix+":"+name));

                            isEnvelope = true;
                            pr.PRparseTypeEnum = InternalParseTypeE.Envelope;
                        }
                        else if (String.Compare(name, "Body", StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            if (!isEnvelope)
                                throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_BodyChild"));

                            if (isBody)
                                throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_BodyOnce"));

                            isBody = true;
                            headerState = HeaderStateEnum.None;
                            isTopFound = false;
                            pr.PRparseTypeEnum = InternalParseTypeE.Body;                           
                        }
                        else if (String.Compare(name, "Header", StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            if (!isEnvelope)
                                throw new SerializationException(SoapUtil.GetResourceString("Serialization_Parser_Header"));

                            pr.PRparseTypeEnum = InternalParseTypeE.Headers;
                            headerState = HeaderStateEnum.FirstHeaderRecord;
                        }
                        else
                            pr.PRparseTypeEnum = InternalParseTypeE.Object; //SoapFault has an envelope key					
                    }
                    else
                    {
                        pr.PRparseTypeEnum = InternalParseTypeE.Object;
                    }

                    stack.Push(pr);
                    break;

                case InternalParseStateE.Member:
                    pr = GetPr();

                    // Members of Top object records cannot be reused because of the need to resolving fake element
                    ParseRecord objectPr = (ParseRecord)stack.Peek();
                    pr.PRname = actualName;
                    pr.PRnameXmlKey = actualPrefix;
                    pr.PRxmlNameSpace = urn;                    
                    pr.PRparseTypeEnum = InternalParseTypeE.Member;
                    pr.PRparseStateEnum = InternalParseStateE.Member;
                    stack.Push(pr);
                    break;

                case InternalParseStateE.MemberChild:
                    objectPr = (ParseRecord)stack.PeekPeek();                   
                    pr = (ParseRecord)stack.Peek();
                    pr.PRmemberValueEnum = InternalMemberValueE.Nested;
                    ProcessAttributes(pr, objectPr);
                    switch (headerState)
                    {
                        case HeaderStateEnum.None:
                        case HeaderStateEnum.TopLevelObject:
                            InternalST.Soap( this,"ObjectReader.Parse 1");
                            objectReader.Parse(pr);
                            pr.PRisParsed = true;
                            break;
                        case HeaderStateEnum.HeaderRecord:
                        case HeaderStateEnum.NestedObject:                          
                            ProcessHeaderMember(pr);
                            break;
                    }

                    ParseRecord nestPr = GetPr();
                    nestPr.PRparseTypeEnum = InternalParseTypeE.Member;
                    nestPr.PRparseStateEnum = InternalParseStateE.Member;
                    nestPr.PRname = actualName;
                    nestPr.PRnameXmlKey = actualPrefix;
                    pr.PRxmlNameSpace = urn;                    
                    currentState = InternalParseStateE.Member;
                    stack.Push(nestPr);
                    break;

                default:
                    MarshalError("StartElement", (ParseRecord)stack.Peek(), actualName, currentState);
                    break;
            }

#if _DEBUG
            InternalST.Soap( this,SerTraceString("StartElement End ", (ParseRecord)stack.Peek(), name, currentState, headerState));
#endif
        }