2002-07-12 Piers Haken <piersh@friksit.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlNamedNodeMap.cs
1 //
2 // System.Xml.XmlNamedNodeMap
3 //
4 // Author:
5 //   Jason Diamond (jason@injektilo.org)
6 //   Duncan Mak  (duncan@ximian.com)
7 //
8 // (C) 2002 Jason Diamond  http://injektilo.org/
9 //
10
11 using System;
12 using System.Collections;
13
14 namespace System.Xml
15 {
16         public class XmlNamedNodeMap : IEnumerable
17         {
18                 XmlNode parent;
19                 ArrayList nodeList;
20                 bool readOnly = false;
21
22                 internal XmlNamedNodeMap (XmlNode parent)
23                 {
24                         this.parent = parent;
25                         nodeList = new ArrayList ();
26                 }
27
28                 public virtual int Count {
29                         get { return nodeList.Count; }
30                 }
31
32                 public virtual IEnumerator GetEnumerator () 
33                 {
34                         return nodeList.GetEnumerator ();
35                 }
36
37                 public virtual XmlNode GetNamedItem (string name)
38                 {
39                         foreach (XmlNode node in nodeList) {
40                                 if (node.Name == name)
41                                         return node;
42                         }
43                         return null;
44                 }
45
46                 public virtual XmlNode GetNamedItem (string localName, string namespaceURI)
47                 {
48                         foreach (XmlNode node in nodeList) {
49                                 if ((node.LocalName == localName)
50                                     && (node.NamespaceURI == namespaceURI))
51                                         return node;
52                         }
53
54                         return null;
55                 }
56                 
57                 public virtual XmlNode Item (int index)
58                 {
59                         if (index < 0 || index > nodeList.Count)
60                                 return null;
61                         else
62                                 return (XmlNode) nodeList [index];
63                 }
64
65                 public virtual XmlNode RemoveNamedItem (string name)
66                 {                       
67                         foreach (XmlNode node in nodeList)
68                                 if (node.Name == name) {
69                                         nodeList.Remove (node);
70                                         return node;
71                                 }
72                         
73                         return null;
74                 }
75
76                 public virtual XmlNode RemoveNamedItem (string localName, string namespaceURI)
77                 {
78                         foreach (XmlNode node in nodeList)
79                                 if ((node.LocalName == localName)
80                                     && (node.NamespaceURI == namespaceURI)) {
81                                         nodeList.Remove (node);
82                                         return node;
83                                 }
84
85                         return null;
86                 }
87
88                 public virtual XmlNode SetNamedItem (XmlNode node)
89                 {
90                         if (readOnly || (node.OwnerDocument != parent.OwnerDocument))
91                                 throw new ArgumentException ("Cannot add to NodeMap.");
92                                                 
93                         foreach (XmlNode x in nodeList)
94                                 if (x.Name == node.Name) {
95                                         nodeList.Remove (x);
96                                         nodeList.Add (node);
97                                         return x;
98                                 }
99                         
100                         nodeList.Add (node);
101                         return null;
102                 }
103
104                 internal ArrayList Nodes { get { return nodeList; } }
105         }
106 }