XmlAttribute.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //
  2. // System.Xml.XmlAttribute
  3. //
  4. // Author:
  5. // Jason Diamond ([email protected])
  6. //
  7. // (C) 2002 Jason Diamond http://injektilo.org/
  8. //
  9. using System;
  10. using System.Text;
  11. namespace System.Xml
  12. {
  13. public class XmlAttribute : XmlNode
  14. {
  15. #region Fields
  16. private XmlLinkedNode lastChild;
  17. private string localName;
  18. private string namespaceURI;
  19. private string prefix;
  20. #endregion
  21. #region Constructor
  22. [MonoTODO("need to set namespaceURI if prefix is recognized built-in ones like xmlns")]
  23. protected internal XmlAttribute (
  24. string prefix,
  25. string localName,
  26. string namespaceURI,
  27. XmlDocument doc) : base (doc)
  28. {
  29. this.prefix = prefix;
  30. this.localName = localName;
  31. this.namespaceURI = namespaceURI;
  32. }
  33. #endregion
  34. #region Properties
  35. public override string BaseURI {
  36. get {
  37. return OwnerElement.BaseURI;
  38. }
  39. }
  40. [MonoTODO ("Setter")]
  41. public override string InnerText {
  42. get {
  43. StringBuilder builder = new StringBuilder ();
  44. AppendChildValues (this, builder);
  45. return builder.ToString ();
  46. }
  47. set {
  48. throw new NotImplementedException ();
  49. }
  50. }
  51. private void AppendChildValues (XmlNode parent, StringBuilder builder)
  52. {
  53. XmlNode node = parent.FirstChild;
  54. while (node != null) {
  55. builder.Append (node.Value);
  56. AppendChildValues (node, builder);
  57. node = node.NextSibling;
  58. }
  59. }
  60. [MonoTODO ("Setter.")]
  61. public override string InnerXml {
  62. get {
  63. // Not sure why this is an override. Passing through for now.
  64. return base.InnerXml;
  65. }
  66. set {
  67. throw new NotImplementedException ();
  68. }
  69. }
  70. public override string LocalName {
  71. get {
  72. return localName;
  73. }
  74. }
  75. public override string Name {
  76. get {
  77. return prefix != String.Empty ? prefix + ":" + localName : localName;
  78. }
  79. }
  80. public override string NamespaceURI {
  81. get {
  82. return namespaceURI;
  83. }
  84. }
  85. public override XmlNodeType NodeType {
  86. get {
  87. return XmlNodeType.Attribute;
  88. }
  89. }
  90. public override XmlDocument OwnerDocument {
  91. get {
  92. return base.OwnerDocument;
  93. }
  94. }
  95. public virtual XmlElement OwnerElement {
  96. get {
  97. return base.ParentNode as XmlElement;
  98. }
  99. }
  100. [MonoTODO]
  101. public override XmlNode ParentNode {
  102. get {
  103. return null;
  104. }
  105. }
  106. [MonoTODO]
  107. // We gotta do more in the set block here
  108. // We need to do the proper tests and throw
  109. // the correct Exceptions
  110. public override string Prefix {
  111. set {
  112. prefix = value;
  113. }
  114. get {
  115. return prefix;
  116. }
  117. }
  118. [MonoTODO]
  119. public virtual bool Specified {
  120. get {
  121. throw new NotImplementedException ();
  122. }
  123. }
  124. public override string Value {
  125. get {
  126. XmlNode firstChild = FirstChild;
  127. if (firstChild == null)
  128. return String.Empty;
  129. return firstChild.Value;
  130. }
  131. set {
  132. XmlNode firstChild = FirstChild;
  133. if (firstChild == null)
  134. AppendChild (OwnerDocument.CreateTextNode (value));
  135. else
  136. firstChild.Value = value;
  137. }
  138. }
  139. #endregion
  140. #region Methods
  141. public override XmlNode CloneNode (bool deep)
  142. {
  143. XmlNode node = new XmlAttribute (prefix, localName, namespaceURI,
  144. OwnerDocument);
  145. if (deep) {
  146. while ((node != null) && (node.HasChildNodes)) {
  147. AppendChild (node.NextSibling.CloneNode (true));
  148. node = node.NextSibling;
  149. }
  150. }
  151. return node;
  152. }
  153. public override void WriteContentTo (XmlWriter w)
  154. {
  155. w.WriteString (Value);
  156. }
  157. public override void WriteTo (XmlWriter w)
  158. {
  159. w.WriteAttributeString (prefix, localName, namespaceURI, Value);
  160. }
  161. #endregion
  162. internal override XmlLinkedNode LastLinkedChild {
  163. get { return lastChild; }
  164. set { lastChild = value; }
  165. }
  166. }
  167. }