// // 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; }
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; } } }
// // 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); }
// // 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; }
// // 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); }
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; } } }