diff --git a/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj b/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj
index 8a73964..cbbf511 100644
--- a/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj
+++ b/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj
@@ -315,9 +315,28 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
diff --git a/ICSharpCode.AvalonEdit/XmlParser/AbstractXmlVisitor.cs b/ICSharpCode.AvalonEdit/XmlParser/AbstractXmlVisitor.cs
new file mode 100644
index 0000000..12682e6
--- /dev/null
+++ b/ICSharpCode.AvalonEdit/XmlParser/AbstractXmlVisitor.cs
@@ -0,0 +1,47 @@
+//
+//
+//
+//
+// $Revision$
+//
+using System;
+using System.Text;
+
+namespace ICSharpCode.AvalonEdit.XmlParser
+{
+ ///
+ /// Derive from this class to create visitor for the XML tree
+ ///
+ public abstract class AbstractXmlVisitor : IXmlVisitor
+ {
+ /// Visit RawDocument
+ public virtual void VisitDocument(RawDocument document)
+ {
+ foreach(RawObject child in document.Children) child.AcceptVisitor(this);
+ }
+
+ /// Visit RawElement
+ public virtual void VisitElement(RawElement element)
+ {
+ foreach(RawObject child in element.Children) child.AcceptVisitor(this);
+ }
+
+ /// Visit RawTag
+ public virtual void VisitTag(RawTag tag)
+ {
+ foreach(RawObject child in tag.Children) child.AcceptVisitor(this);
+ }
+
+ /// Visit RawAttribute
+ public virtual void VisitAttribute(RawAttribute attribute)
+ {
+
+ }
+
+ /// Visit RawText
+ public virtual void VisitText(RawText text)
+ {
+
+ }
+ }
+}
diff --git a/ICSharpCode.AvalonEdit/XmlParser/AttributeCollection.cs b/ICSharpCode.AvalonEdit/XmlParser/AttributeCollection.cs
new file mode 100644
index 0000000..f43fda4
--- /dev/null
+++ b/ICSharpCode.AvalonEdit/XmlParser/AttributeCollection.cs
@@ -0,0 +1,104 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.AvalonEdit.XmlParser
+{
+ ///
+ /// Specailized attribute collection with attribute name caching
+ ///
+ public class AttributeCollection: FilteredCollection>
+ {
+ /// Wrap the given collection. Non-attributes are filtered
+ public AttributeCollection(ChildrenCollection source): base(source) {}
+
+ /// Wrap the given collection. Non-attributes are filtered. Items not matching the condition are filtered.
+ public AttributeCollection(ChildrenCollection source, Predicate