Esempio n. 1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="array"></param>
        /// <param name="arrays"></param>
        /// <param name="recursive"></param>
        /// <returns></returns>
        /// <remarks>Performs deep copy of array, return array with replacements.</remarks>
        internal static PhpArray ArrayReplaceImpl(PhpArray array, PhpArray[] arrays, bool recursive)
        {
            PhpArray result = (PhpArray)array.DeepCopy();

            if (arrays != null)
                foreach (PhpArray array1 in arrays)
                    ArrayReplaceImpl(result, array1, recursive);
            
            //// if called by PHP language then all items in the result should be in place deeply copied:
            //result.InplaceCopyOnReturn = true;
            return result;
        }
Esempio n. 2
0
        private void ParseStep(XmlReader reader, Stack<ElementRecord> elementStack, ref TextRecord textChunk, PhpArray values, PhpArray indices)
        {
            string elementName;
            bool emptyElement;
            ElementRecord currentElementRecord = null;

            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    elementName = reader.Name;
                    emptyElement = reader.IsEmptyElement;
                    PhpArray attributeArray = new PhpArray();

                    if (_processNamespaces && elementName.IndexOf(":") >= 0)
                    {
                        string localName = elementName.Substring(elementName.IndexOf(":") + 1);
                        elementName = reader.NamespaceURI + _namespaceSeparator + localName;
                    }

                    if (reader.MoveToFirstAttribute())
                    {
                        do
                        {                           
                            if (_processNamespaces && reader.Name.StartsWith("xmlns:"))
                            {
                                string namespaceID = reader.Name.Substring(6);
                                string namespaceUri = reader.Value;

                                if (_startNamespaceDeclHandler.Callback != null)
                                    _startNamespaceDeclHandler.Invoke(this, namespaceID, namespaceUri);

                                continue;
                            }

                            attributeArray.Add(_enableCaseFolding ? reader.Name.ToUpperInvariant() : reader.Name, reader.Value);
                        }
                        while (reader.MoveToNextAttribute());   
                    }

                    // update current top of stack
                    if (elementStack.Count != 0)
                    {
                        currentElementRecord = elementStack.Peek();

                        UpdateValueAndIndexArrays(currentElementRecord, ref textChunk, values, indices, true);

                        if (currentElementRecord.State == ElementState.Beginning)
                            currentElementRecord.State = ElementState.Interior;
                    }

                    // push the element into the stack (needed for parse_into_struct)
                    elementStack.Push(
                        new ElementRecord() { 
                            ElementName = elementName,
                            Level = reader.Depth, 
                            State = ElementState.Beginning, 
                            Attributes = (PhpArray)attributeArray.DeepCopy() 
                        });

                    if (_startElementHandler.Callback != null)
                        _startElementHandler.Invoke(this, _enableCaseFolding ? elementName.ToUpperInvariant() : elementName, attributeArray);
                    else
                        if (_defaultHandler.Callback != null) _defaultHandler.Invoke(this, "");

                    if (emptyElement) goto case XmlNodeType.EndElement;    // and end the element immediately (<element/>, XmlNodeType.EndElement will not be called)
                    
                    break;


                case XmlNodeType.EndElement:
                    elementName = reader.Name;

                    if (_processNamespaces && elementName.IndexOf(":") >= 0)
                    {
                        string localName = elementName.Substring(elementName.IndexOf(":") + 1);
                        elementName = reader.NamespaceURI + _namespaceSeparator + localName;
                    }

                    // pop the top element record
                    currentElementRecord = elementStack.Pop();

                    UpdateValueAndIndexArrays(currentElementRecord, ref textChunk, values, indices, false);

                    if (_endElementHandler.Callback != null)
                        _endElementHandler.Invoke(this, _enableCaseFolding ? elementName.ToUpperInvariant() : elementName);
                    else
                        if (_defaultHandler.Callback != null) _defaultHandler.Invoke(this, "");
                    break;


                case XmlNodeType.Whitespace:
                case XmlNodeType.Text:
                case XmlNodeType.CDATA:
                    if (textChunk == null)
                    {
                        textChunk = new TextRecord() { Text = reader.Value };
                    }
                    else
                    {
                        textChunk.Text += reader.Value;
                    }

                    if (_characterDataHandler.Callback != null)
                        _characterDataHandler.Invoke(this, reader.Value);
                    else
                        if (_defaultHandler.Callback != null) _defaultHandler.Invoke(this, reader.Value);
                    break;

                case XmlNodeType.ProcessingInstruction:

                    if (_processingInstructionHandler.Callback != null)
                        _processingInstructionHandler.Invoke(this, reader.Name, reader.Value);
                    else
                        if (_defaultHandler.Callback != null) _defaultHandler.Invoke(this, string.Empty);
                    break;
            }
        }