Beispiel #1
0
    //
    // Public Methods and Properties
    //
    public virtual bool Load(XmlReader rXmlReader)
    {
        //Hook up your reader as my reader
        _rXmlReader = rXmlReader;

        if (rXmlReader is XmlTextReader)
        {
            _eWhitespaceMode = ((XmlTextReader)rXmlReader).WhitespaceHandling;
            _fNamespaces = ((XmlTextReader)rXmlReader).Namespaces;
            _eValidationMode = ValidationType.None;
            //			_eEntityMode = ((XmlValidatingReader)rXmlReader).EntityHandling;
        }
#pragma warning disable 0618
        if (rXmlReader is XmlValidatingReader)
        {
            if (((XmlValidatingReader)rXmlReader).Reader is XmlTextReader)
            {
                _eWhitespaceMode = ((XmlTextReader)((XmlValidatingReader)rXmlReader).Reader).WhitespaceHandling;
            }
            else
            {
                _eWhitespaceMode = WhitespaceHandling.None;
            }
            _fNamespaces = ((XmlValidatingReader)rXmlReader).Namespaces;
            _eValidationMode = ((XmlValidatingReader)rXmlReader).ValidationType;
            _eEntityMode = ((XmlValidatingReader)rXmlReader).EntityHandling;
        }
#pragma warning restore 0618

        DebugTrace("Setting ValidationMode=" + _eValidationMode.ToString());
        DebugTrace("Setting EntityMode=" + _eEntityMode.ToString());
        DebugTrace("Setting WhitespaceMode=" + _eWhitespaceMode.ToString());

        //Process the Document
        try
        {
            _rDocumentRootNode = new CXmlNode("", "", XmlNodeType.Element);
            _rDocumentRootNode._eFlags = NodeFlags.DocumentRoot | NodeFlags.Indent;
            Process(_rDocumentRootNode);
            for (_rRootNode = _rDocumentRootNode.FirstChild; _rRootNode != null && _rRootNode.NodeType != XmlNodeType.Element; _rRootNode = _rRootNode.NextNode) ;
        }
        catch (Exception e)
        {
            //Unhook your reader
            _rXmlReader = null;

            _strParseError = e.ToString();

            if (_fThrow)
            {
                throw (e);
            }

            if (_hr == 0)
                _hr = -1;

            return false;
        }

        //Unhook your reader
        _rXmlReader = null;

        return true;
    }
Beispiel #2
0
    protected void Process(CXmlBase rParentNode)
    {
        CXmlNode rNewNode;

        while (true)
        {
            //We want to pop if Read() returns false, aka EOF
            if (_fReadNode)
            {
                if (!_rXmlReader.Read())
                {
                    DebugTrace("Read() == false");
                    return;
                }
            }
            else
            {
                if (!_rXmlReader.ReadAttributeValue())
                {
                    DebugTrace("ReadAttributeValue() == false");
                    return;
                }
            }

            DebugTrace(_rXmlReader);

            //We also want to pop if we get an EndElement or EndEntity
            if (_rXmlReader.NodeType == XmlNodeType.EndElement ||
                 _rXmlReader.NodeType == XmlNodeType.EndEntity)
            {
                DebugTrace("NodeType == EndElement or EndEntity");
                return;
            }

            rNewNode = GetNewNode(_rXmlReader);
            rNewNode._nDepth = _rXmlReader.Depth;

            // Test for MixedContent and set Indent if necessary
            if ((rParentNode.Flags & NodeFlags.MixedContent) != 0)
            {
                rNewNode._eFlags |= NodeFlags.MixedContent;
                // Indent is off for all new nodes
            }
            else
            {
                rNewNode._eFlags |= NodeFlags.Indent;		// Turn on Indent for current Node
            }

            // Set all Depth 0 nodes to No Mixed Content and Indent True
            if (_rXmlReader.Depth == 0)
            {
                rNewNode._eFlags |= NodeFlags.Indent;			// Turn on Indent
                rNewNode._eFlags &= ~NodeFlags.MixedContent;	// Turn off MixedContent
            }

            rParentNode.InsertNode(rNewNode);

            //Do some special stuff based on NodeType
            switch (_rXmlReader.NodeType)
            {
                case XmlNodeType.EntityReference:
                    if (_eValidationMode == ValidationType.DTD)
                    {
                        //					_rXmlReader.EntityHandling = EntityHandling.ExpandEntities;
                        _rXmlReader.ResolveEntity();
                        Process(rNewNode);
                        //					_rXmlReader.EntityHandling = _eEntityMode;
                    }
                    break;

                case XmlNodeType.Element:
                    if (_rXmlReader.MoveToFirstAttribute())
                    {
                        do
                        {
                            CXmlAttribute rNewAttribute = new CXmlAttribute(_rXmlReader);
                            rNewNode.AddAttribute(rNewAttribute);

                            if (_fExpandAttributeValues)
                            {
                                DebugTrace("Attribute: " + _rXmlReader.Name);
                                _fReadNode = false;
                                Process(rNewAttribute);
                                _fReadNode = true;
                            }
                            else
                            {
                                CXmlNode rValueNode = new CXmlNode("", "", XmlNodeType.Text);
                                rValueNode._eFlags = _eDefaultFlags | NodeFlags.HasValue;

                                rValueNode._strValue = _rXmlReader.Value;

                                DebugTrace("  Value=" + rValueNode.Value, _rXmlReader.Depth + 1);

                                rNewAttribute.InsertNode(rValueNode);
                            }
                        } while (_rXmlReader.MoveToNextAttribute());
                    }

                    if ((rNewNode.Flags & NodeFlags.EmptyElement) == 0)
                        Process(rNewNode);

                    break;

                case XmlNodeType.XmlDeclaration:
                    if (_rXmlReader is XmlTextReader)
                    {
                        _eEncoding = ((XmlTextReader)_rXmlReader).Encoding;
                    }
#pragma warning disable 0618
                    else if (_rXmlReader is XmlValidatingReader)
                    {
                        _eEncoding = ((XmlValidatingReader)_rXmlReader).Encoding;
                    }
#pragma warning restore 0618
                    else
                    {
                        string strValue = rNewNode.NodeValue;
                        int nPos = strValue.IndexOf("encoding");
                        if (nPos != -1)
                        {
                            int nEnd;

                            nPos = strValue.IndexOf("=", nPos);			//Find the = sign
                            nEnd = strValue.IndexOf("\"", nPos) + 1;	//Find the next " character
                            nPos = strValue.IndexOf("'", nPos) + 1;		//Find the next ' character
                            if (nEnd == 0 || (nPos < nEnd && nPos > 0))	//Pick the one that's closer to the = sign
                            {
                                nEnd = strValue.IndexOf("'", nPos);
                            }
                            else
                            {
                                nPos = nEnd;
                                nEnd = strValue.IndexOf("\"", nPos);
                            }
                            string sEncodeName = strValue.Substring(nPos, nEnd - nPos);
                            DebugTrace("XMLDecl contains encoding " + sEncodeName);
                            if (sEncodeName.ToUpper() == "UCS-2")
                            {
                                sEncodeName = "unicode";
                            }
                            _eEncoding = System.Text.Encoding.GetEncoding(sEncodeName);
                        }
                    }
                    break;

                case XmlNodeType.ProcessingInstruction:
                    break;

                case XmlNodeType.Text:
                    if (!_fReadNode)
                    {
                        rNewNode._eFlags = _eDefaultFlags | NodeFlags.AttributeTextNode;
                    }
                    rNewNode._eFlags |= NodeFlags.MixedContent;		// turn on Mixed Content for current node
                    rNewNode._eFlags &= ~NodeFlags.Indent;			// turn off Indent for current node
                    rParentNode._eFlags |= NodeFlags.MixedContent;	// turn on Mixed Content for Parent Node
                    break;

                case XmlNodeType.Whitespace:
                case XmlNodeType.SignificantWhitespace:
                case XmlNodeType.CDATA:
                    rNewNode._eFlags |= NodeFlags.MixedContent;		// turn on Mixed Content for current node
                    rNewNode._eFlags &= ~NodeFlags.Indent;			// turn off Indent for current node
                    rParentNode._eFlags |= NodeFlags.MixedContent;	// turn on Mixed Content for Parent Node
                    break;

                case XmlNodeType.Comment:
                case XmlNodeType.Notation:
                    break;

                case XmlNodeType.DocumentType:
                    if (_rXmlReader.MoveToFirstAttribute())
                    {
                        do
                        {
                            CXmlAttribute rNewAttribute = new CXmlAttribute(_rXmlReader);
                            rNewNode.AddAttribute(rNewAttribute);

                            CXmlNode rValueNode = new CXmlNode(_rXmlReader);
                            rValueNode._strValue = _rXmlReader.Value;
                            rNewAttribute.InsertNode(rValueNode);
                        } while (_rXmlReader.MoveToNextAttribute());
                    }

                    break;

                default:
                    _output.WriteLine("UNHANDLED TYPE, " + _rXmlReader.NodeType.ToString() + " IN Process()!");
                    break;
            }
        }
    }
Beispiel #3
0
    //
    // Public Methods and Properties
    //
    public virtual bool Load(XmlReader rXmlReader)
    {
        //Hook up your reader as my reader
        prXmlReader = rXmlReader;

        //Process the Document
        try
        {
            prDocumentRootNode         = new CXmlNode("", "", XmlNodeType.Element);
            prDocumentRootNode.peFlags = NodeFlags.DocumentRoot | NodeFlags.Indent;
            Process(prDocumentRootNode);
            for (prRootNode = prDocumentRootNode.FirstChild; prRootNode != null && prRootNode.NodeType != XmlNodeType.Element; prRootNode = prRootNode.NextNode)
            {
                ;
            }
        }
        catch (Exception e)
        {
            //Unhook your reader
            prXmlReader = null;

            _strParseError = e.ToString();

            if (_fThrow)
            {
                throw (e);
            }

            if (_hr == 0)
            {
                _hr = -1;
            }

            return(false);
        }

        //Unhook your reader
        prXmlReader = null;

        return(true);
    }
Beispiel #4
0
    //
    // Public Methods and Properties
    //
    public virtual bool Load(XmlReader rXmlReader)
    {
        //Hook up your reader as my reader
        prXmlReader = rXmlReader;

        //Process the Document
        try
        {
            prDocumentRootNode = new CXmlNode("", "", XmlNodeType.Element);
            prDocumentRootNode.peFlags = NodeFlags.DocumentRoot | NodeFlags.Indent;
            Process(prDocumentRootNode);
            for (prRootNode = prDocumentRootNode.FirstChild; prRootNode != null && prRootNode.NodeType != XmlNodeType.Element; prRootNode = prRootNode.NextNode) ;
        }
        catch (Exception e)
        {
            //Unhook your reader
            prXmlReader = null;

            _strParseError = e.ToString();

            if (_fThrow)
            {
                throw (e);
            }

            if (_hr == 0)
                _hr = -1;

            return false;
        }

        //Unhook your reader
        prXmlReader = null;

        return true;
    }
Beispiel #5
0
    //
    // Public Methods and Properties
    //
    public virtual bool Load(XmlReader rXmlReader)
    {
        //Hook up your reader as my reader
        _rXmlReader = rXmlReader;

        if (rXmlReader is XmlTextReader)
        {
            _eWhitespaceMode = ((XmlTextReader)rXmlReader).WhitespaceHandling;
            _fNamespaces     = ((XmlTextReader)rXmlReader).Namespaces;
            _eValidationMode = ValidationType.None;
        }
#pragma warning disable 0618
        if (rXmlReader is XmlValidatingReader)
        {
            if (((XmlValidatingReader)rXmlReader).Reader is XmlTextReader)
            {
                _eWhitespaceMode = ((XmlTextReader)((XmlValidatingReader)rXmlReader).Reader).WhitespaceHandling;
            }
            else
            {
                _eWhitespaceMode = WhitespaceHandling.None;
            }
            _fNamespaces     = ((XmlValidatingReader)rXmlReader).Namespaces;
            _eValidationMode = ((XmlValidatingReader)rXmlReader).ValidationType;
            _eEntityMode     = ((XmlValidatingReader)rXmlReader).EntityHandling;
        }
#pragma warning restore 0618

        DebugTrace("Setting ValidationMode=" + _eValidationMode.ToString());
        DebugTrace("Setting EntityMode=" + _eEntityMode.ToString());
        DebugTrace("Setting WhitespaceMode=" + _eWhitespaceMode.ToString());

        //Process the Document
        try
        {
            _rDocumentRootNode         = new CXmlNode("", "", XmlNodeType.Element);
            _rDocumentRootNode._eFlags = NodeFlags.DocumentRoot | NodeFlags.Indent;
            Process(_rDocumentRootNode);
            for (_rRootNode = _rDocumentRootNode.FirstChild; _rRootNode != null && _rRootNode.NodeType != XmlNodeType.Element; _rRootNode = _rRootNode.NextNode)
            {
                ;
            }
        }
        catch (Exception e)
        {
            //Unhook your reader
            _rXmlReader = null;

            _strParseError = e.ToString();

            if (_fThrow)
            {
                throw (e);
            }

            if (_hr == 0)
            {
                _hr = -1;
            }

            return(false);
        }

        //Unhook your reader
        _rXmlReader = null;

        return(true);
    }
Beispiel #6
0
    protected void Process(CXmlBase rParentNode)
    {
        CXmlNode rNewNode;

        while (true)
        {
            //We want to pop if Read() returns false, aka EOF
            if (_fReadNode)
            {
                if (!_rXmlReader.Read())
                {
                    DebugTrace("Read() == false");
                    return;
                }
            }
            else
            {
                if (!_rXmlReader.ReadAttributeValue())
                {
                    DebugTrace("ReadAttributeValue() == false");
                    return;
                }
            }

            DebugTrace(_rXmlReader);

            //We also want to pop if we get an EndElement or EndEntity
            if (_rXmlReader.NodeType == XmlNodeType.EndElement ||
                _rXmlReader.NodeType == XmlNodeType.EndEntity)
            {
                DebugTrace("NodeType == EndElement or EndEntity");
                return;
            }

            rNewNode         = GetNewNode(_rXmlReader);
            rNewNode._nDepth = _rXmlReader.Depth;

            // Test for MixedContent and set Indent if necessary
            if ((rParentNode.Flags & NodeFlags.MixedContent) != 0)
            {
                rNewNode._eFlags |= NodeFlags.MixedContent;
                // Indent is off for all new nodes
            }
            else
            {
                rNewNode._eFlags |= NodeFlags.Indent;           // Turn on Indent for current Node
            }

            // Set all Depth 0 nodes to No Mixed Content and Indent True
            if (_rXmlReader.Depth == 0)
            {
                rNewNode._eFlags |= NodeFlags.Indent;           // Turn on Indent
                rNewNode._eFlags &= ~NodeFlags.MixedContent;    // Turn off MixedContent
            }

            rParentNode.InsertNode(rNewNode);

            //Do some special stuff based on NodeType
            switch (_rXmlReader.NodeType)
            {
            case XmlNodeType.EntityReference:
                if (_eValidationMode == ValidationType.DTD)
                {
                    _rXmlReader.ResolveEntity();
                    Process(rNewNode);
                }
                break;

            case XmlNodeType.Element:
                if (_rXmlReader.MoveToFirstAttribute())
                {
                    do
                    {
                        CXmlAttribute rNewAttribute = new CXmlAttribute(_rXmlReader);
                        rNewNode.AddAttribute(rNewAttribute);

                        if (_fExpandAttributeValues)
                        {
                            DebugTrace("Attribute: " + _rXmlReader.Name);
                            _fReadNode = false;
                            Process(rNewAttribute);
                            _fReadNode = true;
                        }
                        else
                        {
                            CXmlNode rValueNode = new CXmlNode("", "", XmlNodeType.Text);
                            rValueNode._eFlags = _eDefaultFlags | NodeFlags.HasValue;

                            rValueNode._strValue = _rXmlReader.Value;

                            DebugTrace("  Value=" + rValueNode.Value, _rXmlReader.Depth + 1);

                            rNewAttribute.InsertNode(rValueNode);
                        }
                    } while (_rXmlReader.MoveToNextAttribute());
                }

                if ((rNewNode.Flags & NodeFlags.EmptyElement) == 0)
                {
                    Process(rNewNode);
                }

                break;

            case XmlNodeType.XmlDeclaration:
                if (_rXmlReader is XmlTextReader)
                {
                    _eEncoding = ((XmlTextReader)_rXmlReader).Encoding;
                }
#pragma warning disable 0618
                else if (_rXmlReader is XmlValidatingReader)
                {
                    _eEncoding = ((XmlValidatingReader)_rXmlReader).Encoding;
                }
#pragma warning restore 0618
                else
                {
                    string strValue = rNewNode.NodeValue;
                    int    nPos     = strValue.IndexOf("encoding");
                    if (nPos != -1)
                    {
                        int nEnd;

                        nPos = strValue.IndexOf("=", nPos);             //Find the = sign
                        nEnd = strValue.IndexOf("\"", nPos) + 1;        //Find the next " character
                        nPos = strValue.IndexOf("'", nPos) + 1;         //Find the next ' character
                        if (nEnd == 0 || (nPos < nEnd && nPos > 0))     //Pick the one that's closer to the = sign
                        {
                            nEnd = strValue.IndexOf("'", nPos);
                        }
                        else
                        {
                            nPos = nEnd;
                            nEnd = strValue.IndexOf("\"", nPos);
                        }
                        string sEncodeName = strValue.Substring(nPos, nEnd - nPos);
                        DebugTrace("XMLDecl contains encoding " + sEncodeName);
                        if (sEncodeName.ToUpper() == "UCS-2")
                        {
                            sEncodeName = "unicode";
                        }
                        _eEncoding = System.Text.Encoding.GetEncoding(sEncodeName);
                    }
                }
                break;

            case XmlNodeType.ProcessingInstruction:
                break;

            case XmlNodeType.Text:
                if (!_fReadNode)
                {
                    rNewNode._eFlags = _eDefaultFlags | NodeFlags.AttributeTextNode;
                }
                rNewNode._eFlags    |= NodeFlags.MixedContent;          // turn on Mixed Content for current node
                rNewNode._eFlags    &= ~NodeFlags.Indent;               // turn off Indent for current node
                rParentNode._eFlags |= NodeFlags.MixedContent;          // turn on Mixed Content for Parent Node
                break;

            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
            case XmlNodeType.CDATA:
                rNewNode._eFlags    |= NodeFlags.MixedContent;          // turn on Mixed Content for current node
                rNewNode._eFlags    &= ~NodeFlags.Indent;               // turn off Indent for current node
                rParentNode._eFlags |= NodeFlags.MixedContent;          // turn on Mixed Content for Parent Node
                break;

            case XmlNodeType.Comment:
            case XmlNodeType.Notation:
                break;

            case XmlNodeType.DocumentType:
                if (_rXmlReader.MoveToFirstAttribute())
                {
                    do
                    {
                        CXmlAttribute rNewAttribute = new CXmlAttribute(_rXmlReader);
                        rNewNode.AddAttribute(rNewAttribute);

                        CXmlNode rValueNode = new CXmlNode(_rXmlReader);
                        rValueNode._strValue = _rXmlReader.Value;
                        rNewAttribute.InsertNode(rValueNode);
                    } while (_rXmlReader.MoveToNextAttribute());
                }

                break;

            default:
                _output.WriteLine("UNHANDLED TYPE, " + _rXmlReader.NodeType.ToString() + " IN Process()!");
                break;
            }
        }
    }