//
// System.Xml.XmlEntityReference.cs
// Author:
// Duncan Mak (duncan@ximian.com)
// Atsushi Enomoto (atsushi@ximian.com)
//
// (C) Ximian, Inc. http://www.ximian.com
// (C) 2004 Novell inc.
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
using System.Xml.XPath;
using Mono.Xml;
namespace System.Xml{
public class XmlEntityReference : XmlLinkedNode, IHasXmlChildNode
{
string entityName;
XmlLinkedNode lastLinkedChild;
// Constructor
protected internal XmlEntityReference (string name, XmlDocument doc)
: base (doc)
{
// LAMESPEC: MS CreateNode() allows null node name.
XmlConvert.VerifyName (name);
entityName = doc.NameTable.Add (name);
}
// Properties
XmlLinkedNode IHasXmlChildNode.LastLinkedChild {
get { return lastLinkedChild; }
set { lastLinkedChild = value; }
}
public override string BaseURI {
get { return base.BaseURI; }
}
private XmlEntity Entity {
get {
XmlDocumentType doctype = OwnerDocument.DocumentType;
if (doctype == null)
return null;
if (doctype.Entities == null)
return null;
return doctype.Entities.GetNamedItem (Name) as XmlEntity;
}
}
internal override string ChildrenBaseURI {
get {
XmlEntity ent = Entity;
if (ent == null)
return string.Empty;
if (ent.SystemId == null || ent.SystemId.Length == 0)
return ent.BaseURI;
if (ent.BaseURI == null || ent.BaseURI.Length == 0)
return ent.SystemId;
Uri baseUri = null;
try {
baseUri = new Uri (ent.BaseURI);
} catch (UriFormatException) {
}
XmlResolver resolver = OwnerDocument.Resolver;
if (resolver != null)
return resolver.ResolveUri (baseUri, ent.SystemId).ToString ();
return new Uri (baseUri, ent.SystemId).ToString ();
}
}
public override bool IsReadOnly {
get { return true; }
}
public override string LocalName {
get { return entityName; } // name of the entity referenced.
}
public override string Name {
get { return entityName; } // name of the entity referenced.
}
public override XmlNodeType NodeType {
get { return XmlNodeType.EntityReference; }
}
public override string Value {
get { return null; } // always return null here.
set {
throw new XmlException ("entity reference cannot be set value.");
}
}
internal override XPathNodeType XPathNodeType {
get {
return XPathNodeType.Text;
}
}
// Methods
public override XmlNode CloneNode (bool deep)
{
// API docs: "The replacement text is not included." XmlNode.CloneNode
// "The replacement text is set when node is inserted." XmlEntityReference.CloneNode
//
return new XmlEntityReference (Name, OwnerDocument);
}
public override void WriteContentTo (XmlWriter w)
{
for (int i = 0; i < ChildNodes.Count; i++)
ChildNodes [i].WriteTo (w);
}
public override void WriteTo (XmlWriter w)
{
w.WriteRaw ("&");
w.WriteName (Name);
w.WriteRaw (";");
}
internal void SetReferencedEntityContent ()
{
if (FirstChild != null)
return;
if (OwnerDocument.DocumentType == null)
return;
XmlEntity ent = Entity;
if (ent == null)
InsertBefore (OwnerDocument.CreateTextNode (String.Empty), null, false, true);
else {
for (int i = 0; i < ent.ChildNodes.Count; i++)
InsertBefore (ent.ChildNodes [i].CloneNode (true), null, false, true);
}
}
}
}
|