XmlEntityReference.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // System.Xml.XmlEntityReference.cs
  3. // Author:
  4. // Duncan Mak ([email protected])
  5. // Atsushi Enomoto ([email protected])
  6. //
  7. // (C) Ximian, Inc. http://www.ximian.com
  8. // (C) 2004 Novell inc.
  9. //
  10. using System;
  11. using Mono.Xml;
  12. namespace System.Xml
  13. {
  14. public class XmlEntityReference : XmlLinkedNode
  15. {
  16. string entityName;
  17. // Constructor
  18. protected internal XmlEntityReference (string name, XmlDocument doc)
  19. : base (doc)
  20. {
  21. entityName = doc.NameTable.Add (name);
  22. }
  23. // Properties
  24. public override string BaseURI {
  25. get { return base.BaseURI; }
  26. }
  27. public override bool IsReadOnly {
  28. get { return true; }
  29. }
  30. public override string LocalName {
  31. get { return entityName; } // name of the entity referenced.
  32. }
  33. public override string Name {
  34. get { return entityName; } // name of the entity referenced.
  35. }
  36. public override XmlNodeType NodeType {
  37. get { return XmlNodeType.EntityReference; }
  38. }
  39. public override string Value {
  40. get { return null; } // always return null here.
  41. set {
  42. throw new XmlException ("entity reference cannot be set value.");
  43. }
  44. }
  45. // Methods
  46. public override XmlNode CloneNode (bool deep)
  47. {
  48. // API docs: "The replacement text is not included." XmlNode.CloneNode
  49. // "The replacement text is set when node is inserted." XmlEntityReference.CloneNode
  50. //
  51. return new XmlEntityReference ("", OwnerDocument);
  52. }
  53. public override void WriteContentTo (XmlWriter w)
  54. {
  55. for (int i = 0; i < ChildNodes.Count; i++)
  56. ChildNodes [i].WriteTo (w);
  57. }
  58. public override void WriteTo (XmlWriter w)
  59. {
  60. w.WriteRaw ("&");
  61. w.WriteName (Name);
  62. w.WriteRaw (";");
  63. }
  64. internal void SetReferencedEntityContent ()
  65. {
  66. if (FirstChild != null)
  67. return;
  68. XmlDocumentType doctype = OwnerDocument.DocumentType;
  69. if (doctype == null)
  70. return;
  71. XmlEntity ent = doctype.Entities.GetNamedItem (Name) as XmlEntity;
  72. if (ent == null)
  73. InsertBefore (OwnerDocument.CreateTextNode (String.Empty), null, false, true);
  74. else {
  75. ent.SetEntityContent ();
  76. for (int i = 0; i < ent.ChildNodes.Count; i++)
  77. InsertBefore (ent.ChildNodes [i].CloneNode (true), null, false, true);
  78. }
  79. }
  80. }
  81. }