The Labs \ Source Viewer \ SSCLI \ System.Xml \ XmlCharacterData

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlCharacterData.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
  16. {
  17.     using System.Diagnostics;
  18.     using System.Text;
  19.     using System.Xml.XPath;
  20.    
  21.     // Provides text-manipulation methods that are used by several classes.
  22.     public abstract class XmlCharacterData : XmlLinkedNode
  23.     {
  24.         string data;
  25.        
  26.         //base(doc) will throw exception if doc is null.
  27.         protected internal XmlCharacterData(string data, XmlDocument doc) : base(doc)
  28.         {
  29.             this.data = data;
  30.         }
  31.        
  32.         // Gets or sets the value of the node.
  33.         public override string Value {
  34.             get { return Data; }
  35.             set { Data = value; }
  36.         }
  37.        
  38.         // Gets or sets the concatenated values of the node and
  39.         // all its children.
  40.         public override string InnerText {
  41.             get { return Value; }
  42.             set { Value = value; }
  43.         }
  44.        
  45.         // Contains this node's data.
  46.         public virtual string Data {
  47.             get {
  48.                 if (data != null) {
  49.                     return data;
  50.                 }
  51.                 else {
  52.                     return String.Empty;
  53.                 }
  54.             }
  55.            
  56.             set {
  57.                 XmlNode parent = ParentNode;
  58.                 XmlNodeChangedEventArgs args = GetEventArgs(this, parent, parent, this.data, value, XmlNodeChangedAction.Change);
  59.                
  60.                 if (args != null)
  61.                     BeforeEvent(args);
  62.                
  63.                 data = value;
  64.                
  65.                 if (args != null)
  66.                     AfterEvent(args);
  67.             }
  68.         }
  69.        
  70.         // Gets the length of the data, in characters.
  71.         public virtual int Length {
  72.             get {
  73.                 if (data != null) {
  74.                     return data.Length;
  75.                 }
  76.                 return 0;
  77.             }
  78.         }
  79.        
  80.         // Retrieves a substring of the full string from the specified range.
  81.         public virtual string Substring(int offset, int count)
  82.         {
  83.             int len = data != null ? data.Length : 0;
  84.             if (len > 0) {
  85.                 if (len < (offset + count)) {
  86.                     count = len - offset;
  87.                 }
  88.                 return data.Substring(offset, count);
  89.             }
  90.             return String.Empty;
  91.         }
  92.        
  93.         // Appends the specified string to the end of the character
  94.         // data of the node.
  95.         public virtual void AppendData(string strData)
  96.         {
  97.             XmlNode parent = ParentNode;
  98.             int capacity = data != null ? data.Length : 0;
  99.             if (strData != null)
  100.                 capacity += strData.Length;
  101.             string newValue = new StringBuilder(capacity).Append(data).Append(strData).ToString();
  102.             XmlNodeChangedEventArgs args = GetEventArgs(this, parent, parent, data, newValue, XmlNodeChangedAction.Change);
  103.            
  104.             if (args != null)
  105.                 BeforeEvent(args);
  106.            
  107.             this.data = newValue;
  108.            
  109.             if (args != null)
  110.                 AfterEvent(args);
  111.         }
  112.        
  113.         // Insert the specified string at the specified character offset.
  114.         public virtual void InsertData(int offset, string strData)
  115.         {
  116.             XmlNode parent = ParentNode;
  117.             int capacity = data != null ? data.Length : 0;
  118.             if (strData != null)
  119.                 capacity += strData.Length;
  120.             string newValue = new StringBuilder(capacity).Append(data).Insert(offset, strData).ToString();
  121.             XmlNodeChangedEventArgs args = GetEventArgs(this, parent, parent, data, newValue, XmlNodeChangedAction.Change);
  122.             if (args != null)
  123.                 BeforeEvent(args);
  124.            
  125.             this.data = newValue;
  126.            
  127.             if (args != null)
  128.                 AfterEvent(args);
  129.         }
  130.        
  131.         // Remove a range of characters from the node.
  132.         public virtual void DeleteData(int offset, int count)
  133.         {
  134.             //Debug.Assert(offset >= 0 && offset <= Length);
  135.            
  136.             int len = data != null ? data.Length : 0;
  137.             if (len > 0) {
  138.                 if (len < (offset + count)) {
  139.                     count = Math.Max(len - offset, 0);
  140.                 }
  141.             }
  142.            
  143.             string newValue = new StringBuilder(data).Remove(offset, count).ToString();
  144.             XmlNode parent = ParentNode;
  145.             XmlNodeChangedEventArgs args = GetEventArgs(this, parent, parent, data, newValue, XmlNodeChangedAction.Change);
  146.            
  147.             if (args != null)
  148.                 BeforeEvent(args);
  149.            
  150.             this.data = newValue;
  151.            
  152.             if (args != null)
  153.                 AfterEvent(args);
  154.         }
  155.        
  156.         // Replace the specified number of characters starting at the specified offset with the
  157.         // specified string.
  158.         public virtual void ReplaceData(int offset, int count, string strData)
  159.         {
  160.             //Debug.Assert(offset >= 0 && offset <= Length);
  161.            
  162.             int len = data != null ? data.Length : 0;
  163.             if (len > 0) {
  164.                 if (len < (offset + count)) {
  165.                     count = Math.Max(len - offset, 0);
  166.                 }
  167.             }
  168.            
  169.             StringBuilder temp = new StringBuilder(data).Remove(offset, count);
  170.             string newValue = temp.Insert(offset, strData).ToString();
  171.            
  172.             XmlNode parent = ParentNode;
  173.             XmlNodeChangedEventArgs args = GetEventArgs(this, parent, parent, data, newValue, XmlNodeChangedAction.Change);
  174.            
  175.             if (args != null)
  176.                 BeforeEvent(args);
  177.            
  178.             this.data = newValue;
  179.            
  180.             if (args != null)
  181.                 AfterEvent(args);
  182.         }
  183.        
  184.         internal bool CheckOnData(string data)
  185.         {
  186.             return XmlCharType.Instance.IsOnlyWhitespace(data);
  187.         }
  188.        
  189.         internal bool DecideXPNodeTypeForTextNodes(XmlNode node, ref XPathNodeType xnt)
  190.         {
  191.             //returns true - if all siblings of the node are processed else returns false.
  192.             //The reference XPathNodeType argument being passed in is the watermark that
  193.             //changes according to the siblings nodetype and will contain the correct
  194.             //nodetype when it returns.
  195.            
  196.             Debug.Assert(XmlDocument.IsTextNode(node.NodeType) || (node.ParentNode != null && node.ParentNode.NodeType == XmlNodeType.EntityReference));
  197.             while (node != null) {
  198.                 switch (node.NodeType) {
  199.                     case XmlNodeType.Whitespace:
  200.                         break;
  201.                     case XmlNodeType.SignificantWhitespace:
  202.                         xnt = XPathNodeType.SignificantWhitespace;
  203.                         break;
  204.                     case XmlNodeType.Text:
  205.                     case XmlNodeType.CDATA:
  206.                         xnt = XPathNodeType.Text;
  207.                         return false;
  208.                     case XmlNodeType.EntityReference:
  209.                         bool ret = DecideXPNodeTypeForTextNodes(node.FirstChild, ref xnt);
  210.                         if (!ret) {
  211.                             return false;
  212.                         }
  213.                         break;
  214.                     default:
  215.                         return false;
  216.                 }
  217.                 node = node.NextSibling;
  218.             }
  219.             return true;
  220.         }
  221.     }
  222. }

Developer Fusion