using System;
using System.Collections;
+using System.IO;
+using System.Text;
using System.Xml.XPath;
namespace System.Xml
#region Constructors
- protected internal XmlNode (XmlDocument ownerDocument)
+ internal XmlNode (XmlDocument ownerDocument)
{
this.ownerDocument = ownerDocument;
}
get { return null; }
}
- [MonoTODO]
public virtual string BaseURI
{
- get { throw new NotImplementedException (); }
+ get { return ParentNode.BaseURI; }
}
public virtual XmlNodeList ChildNodes {
[MonoTODO]
public virtual string InnerText {
- get { throw new NotImplementedException (); }
+ get {
+ StringBuilder builder = new StringBuilder ();
+ AppendChildValues (this, builder);
+ return builder.ToString ();
+ }
+
set { throw new NotImplementedException (); }
}
- [MonoTODO]
+ private void AppendChildValues (XmlNode parent, StringBuilder builder)
+ {
+ XmlNode node = parent.FirstChild;
+
+ while (node != null) {
+ if (node.NodeType == XmlNodeType.Text)
+ builder.Append (node.Value);
+ AppendChildValues (node, builder);
+ node = node.NextSibling;
+ }
+ }
+
+ [MonoTODO("Setter.")]
public virtual string InnerXml {
- get { throw new NotImplementedException (); }
+ get {
+ StringWriter sw = new StringWriter ();
+ XmlTextWriter xtw = new XmlTextWriter (sw);
+
+ WriteContentTo(xtw);
+
+ return sw.GetStringBuilder().ToString();
+ }
+
set { throw new NotImplementedException (); }
}
public abstract string Name { get; }
- [MonoTODO]
public virtual string NamespaceURI {
- get { throw new NotImplementedException (); }
+ get { return String.Empty; }
}
public virtual XmlNode NextSibling {
public abstract XmlNodeType NodeType { get; }
- [MonoTODO]
public virtual string OuterXml {
- get { throw new NotImplementedException (); }
+ get {
+ StringWriter sw = new StringWriter ();
+ XmlTextWriter xtw = new XmlTextWriter (sw);
+
+ WriteTo(xtw);
+
+ return sw.GetStringBuilder().ToString();
+ }
}
public virtual XmlDocument OwnerDocument {
get { return parentNode; }
}
- [MonoTODO]
public virtual string Prefix {
- get { throw new NotImplementedException (); }
- set { throw new NotImplementedException (); }
+ get { return String.Empty; }
+ set {}
}
public virtual XmlNode PreviousSibling {
get { return null; }
}
- [MonoTODO]
public virtual string Value {
- get { throw new NotImplementedException (); }
- set { throw new NotImplementedException (); }
+ get { return null; }
+ set { throw new InvalidOperationException ("This node does not have a value"); }
}
#endregion
public virtual XmlNode AppendChild (XmlNode newChild)
{
+ XmlDocument ownerDoc = (NodeType == XmlNodeType.Document) ? (XmlDocument)this : OwnerDocument;
+
+ ownerDoc.onNodeInserting (newChild, this);
+
if (NodeType == XmlNodeType.Document || NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Attribute) {
- XmlLinkedNode newLinkedChild = (XmlLinkedNode)newChild;
+
+ if (newChild.OwnerDocument != ownerDoc)
+ throw new ArgumentException ("Can't append a node created by another document.");
+
+ XmlLinkedNode newLinkedChild = (XmlLinkedNode) newChild;
XmlLinkedNode lastLinkedChild = LastLinkedChild;
+
+ newLinkedChild.parentNode = this;
if (lastLinkedChild != null) {
newLinkedChild.NextLinkedSibling = lastLinkedChild.NextLinkedSibling;
LastLinkedChild = newLinkedChild;
+ ownerDoc.onNodeInserted (newChild, newChild.ParentNode);
+
return newChild;
} else
throw new InvalidOperationException();
[MonoTODO]
public XPathNavigator CreateNavigator ()
{
- throw new NotImplementedException ();
+ return new XmlDocumentNavigator(this);
}
public IEnumerator GetEnumerator ()
public virtual void RemoveAll ()
{
+ XmlDocument ownerDoc = (NodeType == XmlNodeType.Document) ? (XmlDocument)this : OwnerDocument;
+
+ ownerDoc.onNodeRemoving (this, this.ParentNode);
LastLinkedChild = null;
+ ownerDoc.onNodeRemoved (this, this.ParentNode);
}
public virtual XmlNode RemoveChild (XmlNode oldChild)
{
+ OwnerDocument.onNodeRemoving (oldChild, oldChild.ParentNode);
+
if (NodeType == XmlNodeType.Document || NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Attribute)
{
if (IsReadOnly)
oldLinkedChild.NextLinkedSibling = null;
}
+ OwnerDocument.onNodeRemoved (oldChild, oldChild.ParentNode);
+
return oldChild;
}
else
throw new NotImplementedException ();
}
- [MonoTODO]
- public virtual XmlNodeList SelectNodes (string xpath)
+ public XmlNodeList SelectNodes (string xpath)
{
- throw new NotImplementedException ();
+ return SelectNodes (xpath, null);
}
[MonoTODO]
- public virtual XmlNodeList SelectNodes (string xpath, XmlNamespaceManager nsmgr)
+ public XmlNodeList SelectNodes (string xpath, XmlNamespaceManager nsmgr)
{
- throw new NotImplementedException ();
+ XPathNavigator nav = CreateNavigator ();
+ XPathExpression expr = nav.Compile (xpath);
+ if (nsmgr != null)
+ expr.SetContext (nsmgr);
+ XPathNodeIterator iter = nav.Select (expr);
+ ArrayList rgNodes = new ArrayList ();
+ while (iter.MoveNext ())
+ {
+ rgNodes.Add (((XmlDocumentNavigator) iter.Current).Node);
+ }
+ return new XmlNodeArrayList (rgNodes);
}
- [MonoTODO]
- public virtual XmlNode SelectSingleNode (string xpath)
+ public XmlNode SelectSingleNode (string xpath)
{
- throw new NotImplementedException ();
+ return SelectSingleNode (xpath, null);
}
[MonoTODO]
- public virtual XmlNode SelectSingleNode (string xpath, XmlNamespaceManager nsmgr)
+ public XmlNode SelectSingleNode (string xpath, XmlNamespaceManager nsmgr)
{
- throw new NotImplementedException ();
+ XPathNavigator nav = CreateNavigator ();
+ XPathExpression expr = nav.Compile (xpath);
+ if (nsmgr != null)
+ expr.SetContext (nsmgr);
+ XPathNodeIterator iter = nav.Select (expr);
+ if (!iter.MoveNext ())
+ return null;
+ return ((XmlDocumentNavigator) iter.Current).Node;
}
internal void SetParentNode (XmlNode parent)