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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlQualifiedName.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.Collections;
  18.     using System.Diagnostics;
  19.    
  20.     /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName"]/*' />
  21.     /// <devdoc>
  22.     /// <para>[To be supplied.]</para>
  23.     /// </devdoc>
  24.     [Serializable()]
  25.     public class XmlQualifiedName
  26.     {
  27.         string name;
  28.         string ns;
  29.        
  30.         [NonSerialized()]
  31.         Int32 hash;
  32.        
  33.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.Empty"]/*' />
  34.         /// <devdoc>
  35.         /// <para>[To be supplied.]</para>
  36.         /// </devdoc>
  37.         public static readonly XmlQualifiedName Empty = new XmlQualifiedName(string.Empty);
  38.        
  39.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.XmlQualifiedName"]/*' />
  40.         /// <devdoc>
  41.         /// <para>[To be supplied.]</para>
  42.         /// </devdoc>
  43.         public XmlQualifiedName() : this(string.Empty, string.Empty)
  44.         {
  45.         }
  46.        
  47.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.XmlQualifiedName1"]/*' />
  48.         /// <devdoc>
  49.         /// <para>[To be supplied.]</para>
  50.         /// </devdoc>
  51.         public XmlQualifiedName(string name) : this(name, string.Empty)
  52.         {
  53.         }
  54.        
  55.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.XmlQualifiedName2"]/*' />
  56.         /// <devdoc>
  57.         /// <para>[To be supplied.]</para>
  58.         /// </devdoc>
  59.         public XmlQualifiedName(string name, string ns)
  60.         {
  61.             this.ns = ns == null ? string.Empty : ns;
  62.             this.name = name == null ? string.Empty : name;
  63.         }
  64.        
  65.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.Namespace"]/*' />
  66.         /// <devdoc>
  67.         /// <para>[To be supplied.]</para>
  68.         /// </devdoc>
  69.         public string Namespace {
  70.             get { return ns; }
  71.         }
  72.        
  73.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.Name"]/*' />
  74.         /// <devdoc>
  75.         /// <para>[To be supplied.]</para>
  76.         /// </devdoc>
  77.         public string Name {
  78.             get { return name; }
  79.         }
  80.        
  81.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.GetHashCode"]/*' />
  82.         /// <devdoc>
  83.         /// <para>[To be supplied.]</para>
  84.         /// </devdoc>
  85.         public override int GetHashCode()
  86.         {
  87.             if (hash == 0) {
  88.                     /*+ Namespace.GetHashCode()*/                hash = Name.GetHashCode();
  89.                 // for perf reasons we are not taking ns's hashcode.
  90.             }
  91.             return hash;
  92.         }
  93.        
  94.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.IsEmpty"]/*' />
  95.         /// <devdoc>
  96.         /// <para>[To be supplied.]</para>
  97.         /// </devdoc>
  98.         public bool IsEmpty {
  99.             get { return Name.Length == 0 && Namespace.Length == 0; }
  100.         }
  101.        
  102.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.ToString"]/*' />
  103.         /// <devdoc>
  104.         /// <para>[To be supplied.]</para>
  105.         /// </devdoc>
  106.         public override string ToString()
  107.         {
  108.             return Namespace.Length == 0 ? Name : string.Concat(Namespace, ":", Name);
  109.         }
  110.        
  111.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.Equals"]/*' />
  112.         /// <devdoc>
  113.         /// <para>[To be supplied.]</para>
  114.         /// </devdoc>
  115.         public override bool Equals(object other)
  116.         {
  117.             XmlQualifiedName qname;
  118.            
  119.             if ((object)this == other) {
  120.                 return true;
  121.             }
  122.            
  123.             qname = other as XmlQualifiedName;
  124.             if (qname != null) {
  125.                 return (Name == qname.Name && Namespace == qname.Namespace);
  126.             }
  127.             return false;
  128.         }
  129.        
  130.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.operator=="]/*' />
  131.         /// <devdoc>
  132.         /// <para>[To be supplied.]</para>
  133.         /// </devdoc>
  134.         public static bool operator ==(XmlQualifiedName a, XmlQualifiedName b)
  135.         {
  136.             if ((object)a == (object)b)
  137.                 return true;
  138.            
  139.             if ((object)a == null || (object)b == null)
  140.                 return false;
  141.            
  142.             return (a.Name == b.Name && a.Namespace == b.Namespace);
  143.         }
  144.        
  145.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.operator!="]/*' />
  146.         /// <devdoc>
  147.         /// <para>[To be supplied.]</para>
  148.         /// </devdoc>
  149.         public static bool operator !=(XmlQualifiedName a, XmlQualifiedName b)
  150.         {
  151.             return !(a == b);
  152.         }
  153.        
  154.         /// <include file='doc\XmlQualifiedName.uex' path='docs/doc[@for="XmlQualifiedName.ToString1"]/*' />
  155.         /// <devdoc>
  156.         /// <para>[To be supplied.]</para>
  157.         /// </devdoc>
  158.         public static string ToString(string name, string ns)
  159.         {
  160.             return ns == null || ns.Length == 0 ? name : ns + ":" + name;
  161.         }
  162.        
  163.         // --------- Some useful internal stuff -----------------
  164.         internal void Init(string name, string ns)
  165.         {
  166.             Debug.Assert(name != null && ns != null);
  167.             this.name = name;
  168.             this.ns = ns;
  169.             this.hash = 0;
  170.         }
  171.        
  172.         internal void SetNamespace(string ns)
  173.         {
  174.             Debug.Assert(ns != null);
  175.             this.ns = ns;
  176.             //Not changing hash since ns is not used to compute hashcode
  177.         }
  178.        
  179.         internal void Verify()
  180.         {
  181.             XmlConvert.VerifyNCName(name);
  182.             if (ns.Length != 0) {
  183.                 XmlConvert.ToUri(ns);
  184.             }
  185.         }
  186.        
  187.         internal void Atomize(XmlNameTable nameTable)
  188.         {
  189.             Debug.Assert(name != null);
  190.             name = nameTable.Add(name);
  191.             ns = nameTable.Add(ns);
  192.         }
  193.        
  194.         static internal XmlQualifiedName Parse(string s, IXmlNamespaceResolver nsmgr, out string prefix)
  195.         {
  196.             string localName;
  197.             ValidateNames.ParseQNameThrow(s, out prefix, out localName);
  198.            
  199.             string uri = nsmgr.LookupNamespace(prefix);
  200.             if (uri == null) {
  201.                 if (prefix.Length != 0) {
  202.                     throw new XmlException(Res.Xml_UnknownNs, prefix);
  203.                 }
  204.                 else {
  205.                     //Re-map namespace of empty prefix to string.Empty when there is no default namespace declared
  206.                     uri = string.Empty;
  207.                 }
  208.             }
  209.             return new XmlQualifiedName(localName, uri);
  210.         }
  211.        
  212.         internal XmlQualifiedName Clone()
  213.         {
  214.             return (XmlQualifiedName)MemberwiseClone();
  215.         }
  216.        
  217.         static internal int Compare(XmlQualifiedName a, XmlQualifiedName b)
  218.         {
  219.             if (null == a) {
  220.                 return (null == b) ? 0 : -1;
  221.             }
  222.             if (null == b) {
  223.                 return 1;
  224.             }
  225.             int i = String.CompareOrdinal(a.Namespace, b.Namespace);
  226.             if (i == 0) {
  227.                 i = String.CompareOrdinal(a.Name, b.Name);
  228.             }
  229.             return i;
  230.         }
  231.     }
  232. }

Developer Fusion