public void InsertNode(CXmlBase rNode) { if (_rFirstChildNode == null) { _rFirstChildNode = _rLastChildNode = rNode; } else { _rLastChildNode._rNextNode = rNode; _rLastChildNode = rNode; } if ((this._eFlags & NodeFlags.IsWhitespace) == 0) _nChildNodes++; rNode._rParentNode = this; }
public void InsertNode(CXmlBase rNode) { if (prFirstChildNode == null) { prFirstChildNode = prLastChildNode = rNode; } else { prLastChildNode.prNextNode = rNode; prLastChildNode = rNode; } if ((this.peFlags & NodeFlags.IsWhitespace) == 0) pnChildNodes++; rNode.prParentNode = this; }
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; } } }
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; } } }