The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ WriterOutput

  1. //------------------------------------------------------------------------------
  2. // <copyright file="WriterOutput.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Xml;
  21.     using System.Xml.XPath;
  22.     using System.Collections;
  23.    
  24.     internal class WriterOutput : RecordOutput
  25.     {
  26.         private XmlWriter writer;
  27.         private Processor processor;
  28.        
  29.         internal WriterOutput(Processor processor, XmlWriter writer)
  30.         {
  31.             if (writer == null) {
  32.                 throw new ArgumentNullException("writer");
  33.             }
  34.            
  35.             this.writer = writer;
  36.             this.processor = processor;
  37.         }
  38.        
  39.         // RecordOutput interface method implementation
  40.         //
  41.         public Processor.OutputResult RecordDone(RecordBuilder record)
  42.         {
  43.             BuilderInfo mainNode = record.MainNode;
  44.            
  45.             switch (mainNode.NodeType) {
  46.                 case XmlNodeType.Element:
  47.                     this.writer.WriteStartElement(mainNode.Prefix, mainNode.LocalName, mainNode.NamespaceURI);
  48.                    
  49.                     WriteAttributes(record.AttributeList, record.AttributeCount);
  50.                    
  51.                     if (mainNode.IsEmptyTag) {
  52.                         this.writer.WriteEndElement();
  53.                     }
  54.                     break;
  55.                 case XmlNodeType.Text:
  56.                 case XmlNodeType.Whitespace:
  57.                 case XmlNodeType.SignificantWhitespace:
  58.                     this.writer.WriteString(mainNode.Value);
  59.                     break;
  60.                 case XmlNodeType.CDATA:
  61.                     Debug.Assert(false, "XSLT never gives us CDATA");
  62.                     this.writer.WriteCData(mainNode.Value);
  63.                     break;
  64.                 case XmlNodeType.EntityReference:
  65.                     this.writer.WriteEntityRef(mainNode.LocalName);
  66.                     break;
  67.                 case XmlNodeType.ProcessingInstruction:
  68.                     this.writer.WriteProcessingInstruction(mainNode.LocalName, mainNode.Value);
  69.                     break;
  70.                 case XmlNodeType.Comment:
  71.                     this.writer.WriteComment(mainNode.Value);
  72.                     break;
  73.                 case XmlNodeType.Document:
  74.                     break;
  75.                 case XmlNodeType.DocumentType:
  76.                     this.writer.WriteRaw(mainNode.Value);
  77.                     break;
  78.                 case XmlNodeType.EndElement:
  79.                     this.writer.WriteFullEndElement();
  80.                     break;
  81.                 case XmlNodeType.None:
  82.                 case XmlNodeType.Attribute:
  83.                 case XmlNodeType.Entity:
  84.                 case XmlNodeType.Notation:
  85.                 case XmlNodeType.DocumentFragment:
  86.                 case XmlNodeType.EndEntity:
  87.                    
  88.                     break;
  89.                 default:
  90.                     Debug.Fail("Invalid NodeType on output: " + mainNode.NodeType);
  91.                     break;
  92.             }
  93.            
  94.             record.Reset();
  95.             return Processor.OutputResult.Continue;
  96.         }
  97.        
  98.         public void TheEnd()
  99.         {
  100.             this.writer.Flush();
  101.             this.writer = null;
  102.         }
  103.        
  104.         private void WriteAttributes(ArrayList list, int count)
  105.         {
  106.             Debug.Assert(list.Count >= count);
  107.             for (int attrib = 0; attrib < count; attrib++) {
  108.                 Debug.Assert(list[attrib] is BuilderInfo);
  109.                 BuilderInfo attribute = (BuilderInfo)list[attrib];
  110.                 this.writer.WriteAttributeString(attribute.Prefix, attribute.LocalName, attribute.NamespaceURI, attribute.Value);
  111.             }
  112.         }
  113.     }
  114. }

Developer Fusion