Пример #1
0
 public void AddAttribute(CXmlAttribute rAttribute)
 {
     if (_rFirstAttribute == null)
     {
         _rFirstAttribute = rAttribute;
     }
     else
     {
         _rLastAttribute.prNextNode = rAttribute;
     }
     _rLastAttribute = rAttribute;
     _nAttributeCount++;
 }
Пример #2
0
    protected void Process(CXmlBase rParentNode)
    {
        CXmlNode rNewNode;

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

            DebugTrace(prXmlReader);

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

            rNewNode         = GetNewNode(prXmlReader);
            rNewNode.pnDepth = prXmlReader.Depth;

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

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

            rParentNode.InsertNode(rNewNode);


            //Do some special stuff based on NodeType
            switch (prXmlReader.NodeType)
            {
            case XmlNodeType.Element:
                if (prXmlReader.MoveToFirstAttribute())
                {
                    do
                    {
                        CXmlAttribute rNewAttribute = new CXmlAttribute(prXmlReader);
                        rNewNode.AddAttribute(rNewAttribute);

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

                            rValueNode._strValue = prXmlReader.Value;

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

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

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

                break;

            case XmlNodeType.XmlDeclaration:
                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.peFlags = _eDefaultFlags | NodeFlags.AttributeTextNode;
                }
                rNewNode.peFlags    |= NodeFlags.MixedContent;     // turn on Mixed Content for current node
                rNewNode.peFlags    &= ~NodeFlags.Indent;          // turn off Indent for current node
                rParentNode.peFlags |= NodeFlags.MixedContent;     // turn on Mixed Content for Parent Node
                break;

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

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

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

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

                break;

            default:
                TestLog.WriteLine("UNHANDLED TYPE, " + prXmlReader.NodeType.ToString() + " IN Process()!");
                break;
            }
        }
    }
Пример #3
0
 public void AddAttribute(CXmlAttribute rAttribute)
 {
     if (_rFirstAttribute == null)
     {
         _rFirstAttribute = rAttribute;
     }
     else
     {
         _rLastAttribute._rNextNode = rAttribute;
     }
     _rLastAttribute = rAttribute;
     _nAttributeCount++;
 }
Пример #4
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;
            }
        }
    }