2 // Mono.Xml.XPath.XPathDocument2.cs
\r
5 // Atsushi Enomoto <atsushi@ximian.com>
\r
7 // (C)2004 Novell Inc.
\r
9 // Another Document tree model.
\r
13 // Permission is hereby granted, free of charge, to any person obtaining
\r
14 // a copy of this software and associated documentation files (the
\r
15 // "Software"), to deal in the Software without restriction, including
\r
16 // without limitation the rights to use, copy, modify, merge, publish,
\r
17 // distribute, sublicense, and/or sell copies of the Software, and to
\r
18 // permit persons to whom the Software is furnished to do so, subject to
\r
19 // the following conditions:
\r
21 // The above copyright notice and this permission notice shall be
\r
22 // included in all copies or substantial portions of the Software.
\r
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
34 using System.Collections;
\r
35 using System.Collections.Specialized;
\r
39 using System.Xml.XPath;
\r
41 namespace Mono.Xml.XPath
\r
47 public static void Main ()
\r
50 DateTime start = DateTime.Now;
\r
51 Console.WriteLine (DateTime.Now.Ticks);
\r
53 XmlDocument doc = new XmlDocument ();
\r
54 doc.PreserveWhitespace = true;
\r
55 doc.Load (new XmlTextReader ("../TestResult.xml"));
\r
57 XPathDocument2 doc = new XPathDocument2 ();
\r
58 doc.Load (new XmlTextReader ("../TestResult.xml"));
\r
59 // XPathDocument doc = new XPathDocument ("../TestResult.xml", XmlSpace.Preserve);
\r
60 // XPathDocument doc = new XPathDocument ("test.xml", XmlSpace.Preserve);
\r
62 // doc.Load (new XmlTextReader ("test.xml"));
\r
64 // doc.WriteTo (new XmlTextWriter (Console.Out));
\r
66 Console.WriteLine (DateTime.Now.Ticks);
\r
68 XPathNavigator nav = doc.CreateNavigator ();
\r
69 //Console.WriteLine (nav.MoveToFirstChild ());
\r
70 //Console.WriteLine (nav.LocalName + nav.NodeType);
\r
71 //Console.WriteLine (nav.MoveToNext ());
\r
72 //Console.WriteLine (nav.LocalName + nav.NodeType);
\r
73 //Console.WriteLine (nav.MoveToNext ());
\r
74 //Console.WriteLine (nav.LocalName + nav.NodeType);
\r
75 //Console.WriteLine (nav.MoveToNext ());
\r
76 //Console.WriteLine (nav.LocalName + nav.NodeType);
\r
77 //nav.MoveToRoot ();
\r
80 XmlReader reader = nav.ReadSubtree ();
\r
81 XmlTextWriter w = new XmlTextWriter (new StringWriter ());
\r
82 // XmlTextWriter w = new XmlTextWriter (Console.Out);
\r
83 w.WriteNode (reader, false);
\r
84 Console.WriteLine (DateTime.Now.Ticks);
\r
85 Console.WriteLine (DateTime.Now.Ticks - start.Ticks);
\r
86 } catch (Exception ex) {
\r
87 Console.WriteLine (ex);
\r
95 public class XPathDocument2 : IXPathNavigable
\r
99 public XPathDocument2 ()
\r
100 : this (new NameTable ())
\r
104 public XPathDocument2 (XmlNameTable nameTable)
\r
106 root = new XomRoot (nameTable);
\r
109 public XmlNameTable NameTable {
\r
110 get { return root.NameTable; }
\r
113 public void LoadXml (string xml)
\r
115 Load (new XmlTextReader (xml, XmlNodeType.Document, null));
\r
118 public void Load (TextReader reader)
\r
120 Load (new XmlTextReader (reader));
\r
123 public void Load (XmlReader reader)
\r
125 Load (reader, XmlSpace.None);
\r
128 public void Load (XmlReader reader, XmlSpace space)
\r
130 root.Load (reader, space);
\r
133 public void Save (TextWriter writer)
\r
135 XmlTextWriter xtw = new XmlTextWriter (writer);
\r
136 xtw.Formatting = Formatting.Indented;
\r
140 public void Save (XmlWriter writer)
\r
145 public void WriteTo (XmlWriter writer)
\r
147 root.WriteTo (writer);
\r
150 public XPathNavigator CreateNavigator ()
\r
152 return new XomNavigator (root);
\r
158 public struct XmlName
\r
160 public string Prefix;
\r
161 public string LocalName;
\r
162 public string Namespace;
\r
165 public XmlName (string prefix, string name, string ns)
\r
167 this.Prefix = prefix == null ? "" : prefix;
\r
168 this.LocalName = name;
\r
169 this.Namespace = ns == null ? "" : ns;
\r
173 public override bool Equals (object o)
\r
175 if ( !(o is XmlName))
\r
177 XmlName other = (XmlName) o;
\r
178 return LocalName == other.LocalName && Namespace == other.Namespace;
\r
181 public static bool operator == (XmlName n1, XmlName n2)
\r
183 return n1.LocalName == n2.LocalName && n1.Namespace == n2.Namespace;
\r
186 public static bool operator != (XmlName n1, XmlName n2)
\r
188 return n1.LocalName != n2.LocalName || n1.Namespace != n2.Namespace;
\r
191 public override int GetHashCode ()
\r
193 if (fullName == null)
\r
194 fullName = String.Concat (LocalName, "/", Namespace);
\r
195 return fullName.GetHashCode ();
\r
198 public override string ToString ()
\r
200 if (fullName == null)
\r
201 fullName = String.Concat (LocalName, "/", Namespace);
\r
206 public abstract class XomNode
\r
208 XomParentNode parent;
\r
209 string prefixedName;
\r
210 XomNode previousSibling;
\r
211 XomNode nextSibling;
\r
213 public XomRoot Root {
\r
216 while (n.parent != null)
\r
218 return (XomRoot) n;
\r
222 public string PrefixedName {
\r
224 if (prefixedName == null) {
\r
225 if (Prefix.Length > 0)
\r
226 prefixedName = Prefix + ':' + LocalName;
\r
228 prefixedName = LocalName;
\r
230 return prefixedName;
\r
234 public virtual string BaseURI {
\r
235 get { return Root.BaseURI; }
\r
238 public virtual string XmlLang {
\r
239 get { return String.Empty; }
\r
242 public XomParentNode Parent {
\r
243 get { return parent; }
\r
246 public XomNode PreviousSibling {
\r
247 get { return previousSibling; }
\r
250 public XomNode NextSibling {
\r
251 get { return nextSibling; }
\r
254 internal void SetParent (XomParentNode parent)
\r
256 this.parent = parent;
\r
259 internal void SetPreviousSibling (XomNode previous)
\r
261 if (previous.parent != parent || this == previous)
\r
262 throw new InvalidOperationException ();
\r
263 nextSibling = previous.nextSibling;
\r
264 previousSibling = previous;
\r
265 previous.nextSibling = this;
\r
268 internal void SetNextSibling (XomNode next)
\r
270 if (next.parent != parent || this == next)
\r
271 throw new InvalidOperationException ();
\r
272 previousSibling = next.previousSibling;
\r
273 nextSibling = next;
\r
274 next.previousSibling = this;
\r
277 internal void RemoveItself ()
\r
279 if (previousSibling != null)
\r
280 previousSibling.nextSibling = nextSibling;
\r
281 if (nextSibling != null)
\r
282 nextSibling.previousSibling = previousSibling;
\r
286 public string LookupPrefix (string ns)
\r
288 XomElement n = this as XomElement;
\r
290 n = Parent as XomElement;
\r
291 while (n != null) {
\r
292 int len = n.NamespaceCount;
\r
293 for (int i = 0; i < len; i++) {
\r
294 XomNamespace nn = n.GetLocalNamespace (i);
\r
295 if (nn.Value == ns)
\r
296 return nn.LocalName;
\r
302 public string LookupNamespace (string ns)
\r
304 XomElement n = this as XomElement;
\r
306 n = Parent as XomElement;
\r
307 while (n != null) {
\r
308 int len = n.NamespaceCount;
\r
309 for (int i = 0; i < len; i++) {
\r
310 XomNamespace nn = n.GetLocalNamespace (i);
\r
311 if (nn.Namespace== ns)
\r
318 public virtual bool IsEmptyElement {
\r
319 get { return false; }
\r
322 public abstract string LocalName { get; }
\r
324 public abstract string Namespace { get; }
\r
326 public abstract string Prefix { get; }
\r
328 public abstract string Value { get; set; }
\r
330 public abstract XPathNodeType NodeType { get; }
\r
332 public abstract int ChildCount { get; }
\r
334 public virtual XomNode FirstChild { get { return null; } }
\r
336 public virtual XomNode LastChild { get { return null; } }
\r
338 internal abstract void BuildValue (StringBuilder sb);
\r
340 public string OuterXml {
\r
342 StringWriter sw = new StringWriter ();
\r
343 XmlTextWriter xtw = new XmlTextWriter (sw);
\r
345 return sw.ToString ();
\r
349 public string InnerXml {
\r
351 StringWriter sw = new StringWriter ();
\r
352 XmlTextWriter xtw = new XmlTextWriter (sw);
\r
353 for (XomNode n = FirstChild; n != null; n = n.NextSibling)
\r
355 return sw.ToString ();
\r
359 public abstract void WriteTo (XmlWriter writer);
\r
362 public interface IHasXomNode
\r
364 XomNode GetNode ();
\r
367 public abstract class XomParentNode : XomNode
\r
369 XomNode firstChild;
\r
373 public void ReadNode (XmlReader reader, XmlSpace space)
\r
375 switch (reader.ReadState) {
\r
376 case ReadState.Initial:
\r
379 case ReadState.Error:
\r
380 case ReadState.Closed:
\r
381 case ReadState.EndOfFile:
\r
382 throw new ArgumentException ("Argument XmlReader is not readable.");
\r
385 switch (reader.NodeType) {
\r
386 case XmlNodeType.Element:
\r
387 XomElement el = new XomElement (reader.Prefix, reader.LocalName, reader.NamespaceURI, this);
\r
388 if (reader.MoveToFirstAttribute ()) {
\r
390 new XomAttribute (reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value, el);
\r
391 } while (reader.MoveToNextAttribute ());
\r
392 reader.MoveToContent ();
\r
394 if (reader.IsEmptyElement) {
\r
395 el.SetIsEmpty (true);
\r
400 while (reader.NodeType != XmlNodeType.EndElement)
\r
401 el.ReadNode (reader, space);
\r
402 reader.ReadEndElement ();
\r
405 case XmlNodeType.Text:
\r
406 case XmlNodeType.CDATA:
\r
407 XomText text = new XomText (reader.Value, this);
\r
410 case XmlNodeType.SignificantWhitespace:
\r
411 XomSignificantWhitespace sws = new XomSignificantWhitespace (reader.Value, this);
\r
414 case XmlNodeType.Whitespace:
\r
415 if (space == XmlSpace.Default) {
\r
419 XomWhitespace ws = new XomWhitespace (reader.Value, this);
\r
422 case XmlNodeType.ProcessingInstruction:
\r
423 XomPI pi = new XomPI (reader.LocalName, reader.Value, this);
\r
426 case XmlNodeType.Comment:
\r
427 XomComment comment = new XomComment (reader.Value, this);
\r
436 public void AppendChild (XomNode child)
\r
438 InsertBefore (child, null);
\r
441 public void InsertBefore (XomNode child, XomNode nextNode)
\r
443 if (child.Parent != null)
\r
444 throw new InvalidOperationException ("The child already has a parent.");
\r
445 if (nextNode == null) {
\r
446 child.SetParent (this);
\r
447 if (firstChild == null)
\r
448 firstChild = lastChild = child;
\r
450 child.SetPreviousSibling (lastChild);
\r
454 if (nextNode.Parent != this)
\r
455 throw new ArgumentException ("Argument nextNode is not a child of this node.");
\r
456 child.SetNextSibling (nextNode);
\r
461 public abstract void Clear ();
\r
463 public override XomNode FirstChild {
\r
464 get { return firstChild; }
\r
467 public override XomNode LastChild {
\r
468 get { return lastChild; }
\r
471 public override int ChildCount {
\r
472 get { return childCount; }
\r
475 internal void ClearChildren ()
\r
477 firstChild = lastChild = null;
\r
481 public void RemoveChild (XomNode child)
\r
483 if (child == firstChild)
\r
484 firstChild = child.NextSibling;
\r
485 if (child == lastChild)
\r
486 lastChild = child.PreviousSibling;
\r
487 child.RemoveItself ();
\r
491 public override string Value {
\r
493 StringBuilder sb = new StringBuilder ();
\r
495 return sb.ToString ();
\r
499 AppendChild (new XomText (value));
\r
503 internal override void BuildValue (StringBuilder sb)
\r
505 for (XomNode n = FirstChild; n != null; n = n.NextSibling)
\r
510 public class XomRoot : XomParentNode
\r
512 XmlNameTable nameTable;
\r
513 Hashtable identicalElements;
\r
516 public XomRoot (XmlNameTable nameTable)
\r
518 this.nameTable = nameTable;
\r
519 identicalElements = new Hashtable ();
\r
522 public override string BaseURI {
\r
523 get { return baseUri; }
\r
526 public void Load (XmlReader reader)
\r
528 Load (reader, XmlSpace.None);
\r
531 public void Load (XmlReader reader, XmlSpace space)
\r
533 baseUri = reader.BaseURI;
\r
534 while (!reader.EOF)
\r
535 ReadNode (reader, space);
\r
538 public XmlNameTable NameTable {
\r
539 get { return nameTable; }
\r
542 public override string Prefix {
\r
546 public override string LocalName {
\r
550 public override string Namespace {
\r
554 public override XPathNodeType NodeType {
\r
555 get { return XPathNodeType.Root; }
\r
558 public override void Clear ()
\r
563 public override void WriteTo (XmlWriter writer)
\r
565 for (XomNode n = FirstChild; n != null; n = n.NextSibling)
\r
566 n.WriteTo (writer);
\r
569 public XomElement GetIdenticalNode (string id)
\r
571 return identicalElements [id] as XomElement;
\r
574 internal void GetIdenticalNode (string id, XomElement element)
\r
576 identicalElements.Add (id, element);
\r
580 public class XomElement : XomParentNode
\r
583 bool isEmptyElement;
\r
585 ArrayList attributes;
\r
586 ArrayList namespaces;
\r
588 public XomElement (string name)
\r
589 : this ("", name, "", null)
\r
593 public XomElement (string name, XomRoot root)
\r
594 : this ("", name, "", root)
\r
598 public XomElement (string name, string ns)
\r
599 : this ("", name, ns, null)
\r
603 public XomElement (string name, string ns, XomRoot root)
\r
604 : this ("", name, ns, root)
\r
608 public XomElement (string prefix, string name, string ns)
\r
609 : this (prefix, name, ns, null)
\r
613 public XomElement (string prefix, string name, string ns, XomParentNode parent)
\r
615 qname.LocalName = name;
\r
616 qname.Namespace = ns == null ? "" : ns;
\r
617 qname.Prefix = prefix == null ? "" : prefix;
\r
618 if (parent != null)
\r
619 parent.AppendChild (this);
\r
622 public override bool IsEmptyElement {
\r
623 get { return isEmptyElement; }
\r
626 internal void SetIsEmpty (bool value)
\r
628 isEmptyElement = value;
\r
631 public override string Prefix {
\r
632 get { return qname.Prefix; }
\r
635 public override string LocalName {
\r
636 get { return qname.LocalName; }
\r
639 public override string Namespace {
\r
640 get { return qname.Namespace; }
\r
643 public override XPathNodeType NodeType {
\r
644 get { return XPathNodeType.Element; }
\r
647 public override void Clear ()
\r
649 if (attributes != null)
\r
650 attributes.Clear ();
\r
651 if (namespaces != null)
\r
652 namespaces.Clear ();
\r
656 public void AppendAttribute (XomAttribute attr)
\r
658 if (attr.Parent != null)
\r
659 throw new InvalidOperationException ("The argument attribute already have another element owner.");
\r
660 attr.SetParent (this);
\r
661 if (attributes == null)
\r
662 attributes = new ArrayList ();
\r
663 attributes.Add (attr);
\r
667 public void UpdateAttribute (XomAttribute attr)
\r
669 if (attr.Parent != null)
\r
670 throw new InvalidOperationException ("The argument attribute already have another element owner.");
\r
671 XomAttribute existing = GetAttribute (attr.LocalName, attr.Namespace);
\r
672 if (existing != null)
\r
673 RemoveAttribute (existing);
\r
674 if (attributes == null)
\r
675 attributes = new ArrayList ();
\r
676 attr.SetParent (this);
\r
677 attributes.Add (attr);
\r
681 public XomAttribute GetAttribute (int index)
\r
683 return attributes == null ? null : attributes [index] as XomAttribute;
\r
686 public XomAttribute GetAttribute (string name, string ns)
\r
688 if (attributes == null)
\r
690 for (int i = 0; i < attributes.Count; i++) {
\r
691 XomAttribute a = attributes [i] as XomAttribute;
\r
692 if (a.LocalName == name && a.Namespace == ns)
\r
698 public XomAttribute GetNextAttribute (XomAttribute attr)
\r
700 if (attributes == null || attributes.Count == 0)
\r
702 if (attributes [attributes.Count - 1] == attr)
\r
704 // It is not efficient, but usually there won't be so many attributes in an element.
\r
705 int index = attributes.IndexOf (attr);
\r
708 return attributes [index + 1] as XomAttribute;
\r
711 public int AttributeCount {
\r
712 get { return attributes == null ? 0 : attributes.Count; }
\r
715 public void RemoveAttribute (XomAttribute attr)
\r
717 if (attributes == null)
\r
719 attributes.Remove (attr);
\r
720 attr.SetParent (null);
\r
723 public void AppendNamespace (string prefix, string ns)
\r
725 if (namespaces == null)
\r
726 namespaces = new ArrayList ();
\r
727 namespaces.Add (new XomNamespace (prefix, ns));
\r
730 public XomNamespace GetLocalNamespace (int index)
\r
732 if (namespaces == null || namespaces.Count <= index)
\r
734 return namespaces [index] as XomNamespace;
\r
737 public XomNamespace GetLocalNamespace (string prefix)
\r
739 if (namespaces == null)
\r
741 for (int i = 0; i < namespaces.Count; i++) {
\r
742 XomNamespace qname = namespaces [i] as XomNamespace;
\r
743 if (qname.LocalName == prefix)
\r
749 public XomNamespace GetNextLocalNamespace (XomNamespace n)
\r
751 if (namespaces == null || namespaces.Count == 0)
\r
753 if (namespaces [namespaces.Count - 1] == n)
\r
755 // It is not efficient, but usually there won't be so many attributes in an element.
\r
756 int index = namespaces.IndexOf (n);
\r
759 return namespaces [index + 1] as XomNamespace;
\r
762 public int NamespaceCount {
\r
763 get { return namespaces == null ? 0 : namespaces.Count; }
\r
766 public void RemoveNamespace (string prefix)
\r
768 if (namespaces == null)
\r
770 for (int i = 0; i < namespaces.Count; i++) {
\r
771 XomNamespace qname = namespaces [i] as XomNamespace;
\r
772 if (qname.LocalName == prefix) {
\r
773 namespaces.RemoveAt (i);
\r
779 public override void WriteTo (XmlWriter writer)
\r
781 writer.WriteStartElement (Prefix, LocalName, Namespace);
\r
782 if (namespaces != null) {
\r
783 foreach (XomNamespace n in namespaces)
\r
784 n.WriteTo (writer);
\r
786 if (attributes != null) {
\r
787 foreach (XomAttribute a in attributes)
\r
788 a.WriteTo (writer);
\r
791 for (XomNode n = FirstChild; n != null; n = n.NextSibling)
\r
792 n.WriteTo (writer);
\r
794 writer.WriteEndElement ();
\r
798 public class XomAttribute : XomNode
\r
803 public XomAttribute (string name, string value)
\r
804 : this ("", name, "", value, null)
\r
808 public XomAttribute (string name, string value, XomElement owner)
\r
809 : this ("", name, "", value, owner)
\r
813 public XomAttribute (string name, string ns, string value)
\r
814 : this ("", name, ns, value, null)
\r
818 public XomAttribute (string name, string ns, string value, XomElement owner)
\r
819 : this ("", name, ns, value, owner)
\r
823 public XomAttribute (string prefix, string name, string ns, string value)
\r
824 : this ("", name, ns, value, null)
\r
828 public XomAttribute (string prefix, string name, string ns, string value, XomElement owner)
\r
830 qname.LocalName = name;
\r
831 qname.Namespace = ns;
\r
832 qname.Prefix = prefix;
\r
833 this.value = value;
\r
835 owner.AppendAttribute (this);
\r
838 public override string Prefix {
\r
839 get { return qname.Prefix; }
\r
842 public override string LocalName {
\r
843 get { return qname.LocalName; }
\r
846 public override string Namespace {
\r
847 get { return qname.Namespace; }
\r
850 public override XPathNodeType NodeType {
\r
851 get { return XPathNodeType.Attribute; }
\r
854 public override int ChildCount { get { return 0; } }
\r
856 public override string Value {
\r
857 get { return value; }
\r
858 set { this.value = value; }
\r
861 internal override void BuildValue (StringBuilder sb)
\r
866 public override void WriteTo (XmlWriter writer)
\r
868 writer.WriteAttributeString (Prefix, LocalName, Namespace, Value);
\r
872 public class XomNamespace : XomNode
\r
874 #region static members
\r
875 static XomNamespace xml;
\r
877 static XomNamespace ()
\r
879 xml = new XomNamespace ("xml", "http://www.w3.org/XML/1998/namespace");
\r
882 public static XomNamespace Xml {
\r
883 get { return xml; }
\r
889 public XomNamespace (string prefix, string ns)
\r
891 qname.LocalName = prefix;
\r
892 qname.Namespace = ns;
\r
895 public override int ChildCount {
\r
899 public override string LocalName {
\r
900 get { return qname.LocalName; }
\r
903 public override string Prefix {
\r
904 get { return LocalName; }
\r
907 public override string Namespace {
\r
908 get { return Value; }
\r
911 public override string Value {
\r
912 get { return qname.Namespace; }
\r
913 set { qname.Namespace = value; }
\r
916 public override XPathNodeType NodeType {
\r
917 get { return XPathNodeType.Namespace; }
\r
920 public override void WriteTo (XmlWriter writer)
\r
922 if (LocalName != "")
\r
923 writer.WriteAttributeString ("xmlns", LocalName, "http://www.w3.org/2000/xmlns/", Namespace);
\r
925 writer.WriteAttributeString ("", "xmlns", "http://www.w3.org/2000/xmlns/", Namespace);
\r
928 internal override void BuildValue (StringBuilder sb)
\r
934 public class XomComment : XomNode
\r
938 public XomComment (string value)
\r
939 : this (value, null)
\r
943 public XomComment (string value, XomParentNode parent)
\r
945 this.value = value;
\r
946 if (parent != null)
\r
947 parent.AppendChild (this);
\r
950 public override string Prefix {
\r
954 public override string LocalName {
\r
958 public override string Namespace {
\r
962 public override XPathNodeType NodeType {
\r
963 get { return XPathNodeType.Comment; }
\r
966 public override string Value {
\r
967 get { return value; }
\r
968 set { this.value += value; }
\r
971 internal override void BuildValue (StringBuilder sb)
\r
976 public override int ChildCount { get { return 0; } }
\r
978 public override void WriteTo (XmlWriter writer)
\r
980 writer.WriteComment (Value);
\r
984 public class XomPI : XomNode
\r
989 public XomPI (string name, string value)
\r
990 : this (name, value, null)
\r
994 public XomPI (string name, string value, XomParentNode parent)
\r
999 this.value = value;
\r
1000 if (parent != null)
\r
1001 parent.AppendChild (this);
\r
1004 public override string Prefix {
\r
1005 get { return ""; }
\r
1008 public override string LocalName {
\r
1009 get { return name; }
\r
1012 public override string Namespace {
\r
1013 get { return ""; }
\r
1016 public override XPathNodeType NodeType {
\r
1017 get { return XPathNodeType.ProcessingInstruction; }
\r
1020 public override string Value {
\r
1021 get { return value; }
\r
1022 set { this.value += value; }
\r
1025 internal override void BuildValue (StringBuilder sb)
\r
1027 sb.Append (value);
\r
1030 public override int ChildCount { get { return 0; } }
\r
1032 public override void WriteTo (XmlWriter writer)
\r
1034 writer.WriteProcessingInstruction (LocalName, Value);
\r
1038 public class XomText : XomNode
\r
1042 public XomText (string value)
\r
1043 : this (value, null)
\r
1047 public XomText (string value, XomParentNode parent)
\r
1049 this.value = value;
\r
1050 if (parent != null)
\r
1051 parent.AppendChild (this);
\r
1054 public override string Prefix {
\r
1055 get { return ""; }
\r
1058 public override string LocalName {
\r
1059 get { return ""; }
\r
1062 public override string Namespace {
\r
1063 get { return ""; }
\r
1066 public override string Value {
\r
1067 get { return value; }
\r
1068 set { this.value += value; }
\r
1071 public override XPathNodeType NodeType {
\r
1072 get { return XPathNodeType.Text; }
\r
1075 internal override void BuildValue (StringBuilder sb)
\r
1077 sb.Append (value);
\r
1080 public override int ChildCount { get { return 0; } }
\r
1082 public override void WriteTo (XmlWriter writer)
\r
1084 writer.WriteString (Value);
\r
1088 public class XomWhitespace : XomNode
\r
1092 public XomWhitespace (string value)
\r
1093 : this (value, null)
\r
1097 public XomWhitespace (string value, XomParentNode parent)
\r
1099 this.value = value;
\r
1100 if (parent != null)
\r
1101 parent.AppendChild (this);
\r
1104 public override string Prefix {
\r
1105 get { return ""; }
\r
1108 public override string LocalName {
\r
1109 get { return ""; }
\r
1112 public override string Namespace {
\r
1113 get { return ""; }
\r
1116 public override string Value {
\r
1117 get { return value; }
\r
1118 set { this.value += value; }
\r
1121 public override XPathNodeType NodeType {
\r
1122 get { return XPathNodeType.Whitespace; }
\r
1125 internal override void BuildValue (StringBuilder sb)
\r
1127 sb.Append (value);
\r
1130 public override int ChildCount { get { return 0; } }
\r
1132 public override void WriteTo (XmlWriter writer)
\r
1134 writer.WriteString (Value);
\r
1138 public class XomSignificantWhitespace : XomNode
\r
1142 public XomSignificantWhitespace (string value)
\r
1143 : this (value, null)
\r
1147 public XomSignificantWhitespace (string value, XomParentNode parent)
\r
1149 this.value = value;
\r
1150 if (parent != null)
\r
1151 parent.AppendChild (this);
\r
1154 public override string Prefix {
\r
1155 get { return ""; }
\r
1158 public override string LocalName {
\r
1159 get { return ""; }
\r
1162 public override string Namespace {
\r
1163 get { return ""; }
\r
1166 public override string Value {
\r
1167 get { return value; }
\r
1168 set { this.value += value; }
\r
1171 public override XPathNodeType NodeType {
\r
1172 get { return XPathNodeType.SignificantWhitespace; }
\r
1175 internal override void BuildValue (StringBuilder sb)
\r
1177 sb.Append (value);
\r
1180 public override int ChildCount { get { return 0; } }
\r
1182 public override void WriteTo (XmlWriter writer)
\r
1184 writer.WriteString (Value);
\r