//
using System;
+using System.Text;
+using System.Xml.XPath;
namespace System.Xml
{
{
#region Fields
- private XmlElement ownerElement;
private XmlLinkedNode lastChild;
private string localName;
private string namespaceURI;
private string prefix;
+ internal bool isDefault;
+ private XmlElement ownerElement;
#endregion
#region Constructor
+ [MonoTODO("need to set namespaceURI if prefix is recognized built-in ones like xmlns")]
protected internal XmlAttribute (
string prefix,
string localName,
string namespaceURI,
XmlDocument doc) : base (doc)
{
+ // What to be recognized is: xml:space, xml:lang, xml:base, and
+ // xmlns and xmlns:* (when XmlDocument.Namespaces = true only)
this.prefix = prefix;
this.localName = localName;
this.namespaceURI = namespaceURI;
#region Properties
- [MonoTODO]
public override string BaseURI {
get {
- throw new NotImplementedException ();
+ return OwnerElement.BaseURI;
}
}
- [MonoTODO]
public override string InnerText {
get {
- throw new NotImplementedException ();
- }
+ StringBuilder builder = new StringBuilder ();
+ AppendChildValues (this, builder);
+ return builder.ToString ();
+ }
set {
- throw new NotImplementedException ();
+ Value = value;
}
}
- [MonoTODO]
+ private void AppendChildValues (XmlNode parent, StringBuilder builder)
+ {
+ XmlNode node = parent.FirstChild;
+
+ while (node != null) {
+ builder.Append (node.Value);
+ AppendChildValues (node, builder);
+ node = node.NextSibling;
+ }
+ }
+
+ [MonoTODO ("Setter is incomplete(XmlTextReader.ReadAttribute is incomplete;No resolution for xml:lang/space")]
public override string InnerXml {
get {
- throw new NotImplementedException ();
+ // Not sure why this is an override. Passing through for now.
+ return base.InnerXml;
}
set {
- throw new NotImplementedException ();
+ XmlNamespaceManager nsmgr = ConstructNamespaceManager ();
+ XmlParserContext ctx = new XmlParserContext (OwnerDocument.NameTable, nsmgr, XmlLang, this.XmlSpace);
+ XmlTextReader xtr = OwnerDocument.ReusableReader;
+ xtr.SetReaderContext (BaseURI, ctx);
+ xtr.SetReaderFragment (new System.IO.StringReader ("'" + value.Replace ("'", "'") + "'"), XmlNodeType.Attribute);
+
+ OwnerDocument.ReadAttributeNodeValue (xtr, this);
}
}
}
}
+ internal override XPathNodeType XPathNodeType {
+ get {
+ return XPathNodeType.Attribute;
+ }
+ }
+
public override XmlDocument OwnerDocument {
get {
return base.OwnerDocument;
}
}
- [MonoTODO]
public override XmlNode ParentNode {
get {
+ // It always returns null (by specification).
return null;
}
}
+ [MonoTODO("setter incomplete (name character check, format check, wrong prefix&nsURI)")]
+ // We gotta do more in the set block here
+ // We need to do the proper tests and throw
+ // the correct Exceptions
+ //
+ // Wrong cases are: (1)check readonly, (2)check character validity,
+ // (3)check format validity, (4)this is attribute and qualifiedName != "xmlns"
+ // (5)when argument is 'xml' or 'xmlns' and namespaceURI doesn't match
public override string Prefix {
+ set {
+ if(IsReadOnly)
+ throw new XmlException ("This node is readonly.");
+
+ XmlNamespaceManager nsmgr = ConstructNamespaceManager ();
+ string nsuri = nsmgr.LookupNamespace (value);
+ if(nsuri == null)
+ throw new XmlException ("Namespace URI not found for this prefix");
+
+ prefix = value;
+ }
+
get {
return prefix;
}
}
- [MonoTODO]
+ [MonoTODO("There are no code which sets 'specified = true', so this logic is without checking.")]
public virtual bool Specified {
get {
- throw new NotImplementedException ();
+ return !isDefault;
}
}
}
}
+ internal override string XmlLang {
+ get { return OwnerElement.XmlLang; }
+ }
+
+ internal override XmlSpace XmlSpace {
+ get { return OwnerElement.XmlSpace; }
+ }
+
#endregion
#region Methods
return node;
}
- internal void SetOwnerElement (XmlElement ownerElement)
- {
- this.ownerElement = ownerElement;
+ // Parent of XmlAttribute must be null
+ internal void SetOwnerElement (XmlElement el) {
+ ownerElement = el;
}
- [MonoTODO]
public override void WriteContentTo (XmlWriter w)
{
- throw new NotImplementedException ();
+ w.WriteString (Value);
}
- [MonoTODO]
public override void WriteTo (XmlWriter w)
{
- throw new NotImplementedException ();
+ w.WriteAttributeString (prefix, localName, namespaceURI, Value);
}
#endregion