/// <summary> /// Create either the Html or Xml writer and send any cached events to it. /// </summary> private void CreateWrappedWriter(XmlOutputMethod outMethod) { Debug.Assert(_wrapped == null); // Create either the Xml or Html writer _writerSettings.ReadOnly = false; _writerSettings.OutputMethod = outMethod; // If Indent was not set by the user, then default to True for Html if (outMethod == XmlOutputMethod.Html && _writerSettings.IndentInternal == TriState.Unknown) { _writerSettings.Indent = true; } _writerSettings.ReadOnly = true; if (_textWriter != null) { _wrapped = ((XmlWellFormedWriter)XmlWriter.Create(_textWriter, _writerSettings)).RawWriter; } else { _wrapped = ((XmlWellFormedWriter)XmlWriter.Create(_strm, _writerSettings)).RawWriter; } // Send cached events to the new writer _eventCache.EndEvents(); _eventCache.EventsToWriter(_wrapped); // Send OnRemoveWriter event if (_onRemove != null) { (this._onRemove)(_wrapped); } }
/// <summary> /// Create a document from the cache of events. If a document has already been created previously, return it. /// This method is thread-safe, and is always guaranteed to return the exact same document, no matter how many /// threads have called it concurrently. /// </summary> public XPathNavigator GetNavigator(XmlEventCache events, XmlNameTable nameTable) { if (this.cache == null) { // Create XPathDocument from event cache XPathDocument doc = new XPathDocument(nameTable); XmlRawWriter writer = doc.LoadFromWriter(XPathDocument.LoadFlags.AtomizeNames | (events.HasRootNode ? XPathDocument.LoadFlags.None : XPathDocument.LoadFlags.Fragment), events.BaseUri); events.EventsToWriter(writer); writer.Close(); this.cache = doc; } return ((XPathDocument) this.cache).CreateNavigator(); }