Exemplo n.º 1
0
 /// <summary>
 /// Checks whether an attribute is an property attribute.
 /// </summary>
 /// <param name="attr">Attribute to Test.</param>
 /// <param name="nsMapper">The namespace prefix mappings to use when expanding the namespace prefix of the attribute.</param>
 /// <returns>True if is an property attribute.</returns>
 public static bool IsPropertyAttribute(AttributeEvent attr, INamespaceMapper nsMapper)
 {
     // QName must be a valid Property Attribute Uri
     // Any string value allowed so if Uri test is true then we're a property Attribute
     return(nsMapper.HasNamespace(attr.Namespace) &&
            IsPropertyAttributeURI(nsMapper.GetNamespaceUri(attr.Namespace), attr.LocalName));
 }
Exemplo n.º 2
0
 /// <summary>
 /// Checks whether an attribute is an rdf:datatype attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:datatype attribute</returns>
 public static bool IsDataTypeAttribute(AttributeEvent attr)
 {
     //QName must be rdf:datatype
     if (attr.QName.Equals("rdf:datatype"))
     {
         //Must be a valid RDF Uri Reference
         return(IsRdfUriReference(attr.Value));
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 3
0
 /// <summary>
 /// Checks whether an attribute is an rdf:datatype attribute.
 /// </summary>
 /// <param name="attr">Attribute to Test.</param>
 /// <param name="namespaceMapper">The namespace prefix mappings to use when expanding the namespace prefix of the attribute.</param>
 /// <returns>True if is an rdf:datatype attribute.</returns>
 public static bool IsDataTypeAttribute(AttributeEvent attr, INestedNamespaceMapper namespaceMapper)
 {
     // QName must be rdf:datatype
     if (namespaceMapper.HasNamespace(attr.Namespace) && namespaceMapper.GetNamespaceUri(attr.Namespace).ToString().Equals(NamespaceMapper.RDF) && attr.LocalName.Equals("datatype"))
     {
         // Must be a valid RDF Uri Reference
         return(IsRdfUriReference(attr.Value));
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 4
0
 /// <summary>
 /// Checks whether an attribute is an rdf:about attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:about attribute</returns>
 public static bool IsAboutAttribute(AttributeEvent attr)
 {
     //QName must be rdf:id
     if (attr.QName.Equals("rdf:about"))
     {
         //Must be a valid RDF Uri Reference
         return(IsRdfUriReference(attr.Value));
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 5
0
 /// <summary>
 /// Checks whether an attribute is an rdf:about attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:about attribute</returns>
 public static bool IsAboutAttribute(AttributeEvent attr)
 {
     //QName must be rdf:id
     if (attr.QName.Equals("rdf:about"))
     {
         //Must be a valid RDF Uri Reference
         return IsRdfUriReference(attr.Value);
     }
     else
     {
         return false;
     }
 }
Exemplo n.º 6
0
 /// <summary>
 /// Checks whether an attribute is an rdf:resource attribute.
 /// </summary>
 /// <param name="attr">Attribute to Test.</param>
 /// <param name="nsMapper">The namespace prefix mappings to use when expanding the namespace prefix of the attribute.</param>
 /// <returns>True if is an rdf:resource attribute.</returns>
 public static bool IsResourceAttribute(AttributeEvent attr, INamespaceMapper nsMapper)
 {
     // QName must be rdf:resource
     if (nsMapper.HasNamespace(attr.Namespace) &&
         nsMapper.GetNamespaceUri(attr.Namespace).ToString().Equals(NamespaceMapper.RDF) &&
         attr.LocalName.Equals("resource"))
     {
         // Must be a valid RDF Uri Reference
         return(IsRdfUriReference(attr.Value));
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 7
0
        public static XamlNode Parse(string xml, NodeEvent evstart, NodeEvent evend, AttributeEvent evattr)
        {
            XamlNode root;
            bool     exists = cache.TryGetValue(xml, out root);

            if (!exists)
            {
                root = new XamlNode()
                {
                    outerXml = xml
                }
            }
            ;
            root.Parse(evstart, evend, evattr);
            if (!exists)
            {
                cache[xml] = root;
            }
            return(root);
        }
Exemplo n.º 8
0
 /// <summary>
 /// Checks whether an attribute is an rdf:nodeID attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:nodeID attribute</returns>
 /// <remarks>Does some validation on ID value but other validation occurs in the <see cref="ValidateID()">ValidateID</see> method which is called at other points in the Parsing</remarks>
 public static bool IsNodeIDAttribute(AttributeEvent attr)
 {
     //QName must be rdf:nodeID
     if (attr.QName.Equals("rdf:nodeID"))
     {
         //Must be a valid RDF ID
         if (IsRdfID(attr.Value))
         {
             //OK
             return(true);
         }
         else
         {
             //Invalid RDF ID so Error
             throw ParserHelper.Error("The value '" + attr.Value + "' for rdf:id is not valid, RDF IDs can only be valid NCNames as defined by the W3C XML Namespaces specification", attr);
         }
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 9
0
 /// <summary>
 /// Checks whether an attribute is an rdf:nodeID attribute.
 /// </summary>
 /// <param name="attr">Attribute to Test.</param>
 /// <param name="nsMapper">The namespace prefix mappings to use when expanding the namespace prefix of the attribute.</param>
 /// <returns>True if is an rdf:nodeID attribute.</returns>
 /// <remarks>Does some validation on ID value but other validation occurs at other points in the Parsing.</remarks>
 public static bool IsNodeIDAttribute(AttributeEvent attr, INamespaceMapper nsMapper)
 {
     // QName must be rdf:nodeID
     if (nsMapper.HasNamespace(attr.Namespace) && nsMapper.GetNamespaceUri(attr.Namespace).ToString().Equals(NamespaceMapper.RDF) && attr.LocalName.Equals("nodeID"))
     {
         // Must be a valid RDF ID
         if (IsRdfID(attr.Value))
         {
             // OK
             return(true);
         }
         else
         {
             // Invalid RDF ID so Error
             throw ParserHelper.Error("The value '" + attr.Value + "' for rdf:id is not valid, RDF IDs can only be valid NCNames as defined by the W3C XML Namespaces specification", attr);
         }
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 10
0
        /**
         * @node If it's not null, it probably means we're on the top node and just
         *              got called from public Parse method
         * @parent If it's null, it means we're on the top node
         * @skip don't do a read, we're already on the next node and ready to process it
         *
         * If this method returns null, it means it has reached the end of the current
         * xml subtree (the end element of the parent node)
         **/
        static XamlNode Parse(XmlReader reader, XamlNode parent, XamlNode node,
                              NodeEvent evstart, NodeEvent evend,
                              AttributeEvent evattr, bool skip = false)
        {
            if (!skip)
            {
                reader.Read();
            }

            if (parent == null)
            {
                while (reader.NodeType != XmlNodeType.Element)
                {
                    if (!reader.Read())
                    {
                        return(null);
                    }
                }
            }
            else
            {
                do
                {
                    while (reader.NodeType != XmlNodeType.Element &&
                           reader.NodeType != XmlNodeType.EndElement &&
                           reader.NodeType != XmlNodeType.Text)
                    {
                        if (!reader.Read())
                        {
                            return(null);
                        }
                    }
                    if (reader.NodeType == XmlNodeType.Element &&
                        parent.top.IgnorablePrefixes.Contains(reader.Prefix))
                    {
                        reader.Skip();
                    }
                    else
                    {
                        break;
                    }
                } while (true);
            }

            if (reader.NodeType == XmlNodeType.EndElement)
            {
                return(null);
            }

            if (node == null)
            {
                node = new XamlNode();
            }

            node.Parsed = false;
            node.Ignore = false;

            if (!node.Initialized)
            {
                node.parent = parent;

                if (parent != null)
                {
                    node.top = parent.top;
                }
                else
                {
                    node.ignorablePrefixes = new List <string> ();
                    node.top = node;
                }

                node.type           = reader.NodeType;
                node.namespaceURI   = reader.NamespaceURI;
                node.prefix         = reader.Prefix;
                node.name           = reader.Name;
                node.localName      = reader.LocalName;
                node.IsEmptyElement = reader.IsEmptyElement;
                node.HasValue       = reader.HasValue;
                node.XmlSpace       = reader.XmlSpace;
                node.LineNumber     = -1;
                node.LinePosition   = -1;
                node.IsNsXaml       = node.NamespaceURI == XamlUri;
                node.IsNsClr        = node.NamespaceURI.StartsWith("clr-namespace");
                if (parent == null)
                {
                    node.DefaultXmlns = reader.GetAttribute("xmlns");
                }

                if (node.IsNsClr)
                {
                    int end = node.NamespaceURI.IndexOf(';');
                    if (end == -1)
                    {
                        end = node.NamespaceURI.Length;
                    }
                    node.ClrNamespace = node.NamespaceURI.Substring(14, end - 14);
                }

                if (node.IsNsClr && node.NamespaceURI.IndexOf(";assembly=") + 10 < node.NamespaceURI.Length)
                {
                    node.Assembly = node.NamespaceURI.Substring(node.NamespaceURI.IndexOf(";assembly=") + 10);
                }

                if (node.HasValue)
                {
                    node.val = reader.Value;
                }


                IXmlLineInfo linfo = reader as IXmlLineInfo;
                if (linfo != null)
                {
                    node.LineNumber   = linfo.LineNumber;
                    node.LinePosition = linfo.LinePosition;
                }

                if (reader.HasAttributes)
                {
                    string ig = reader.GetAttribute("Ignorable", IgnorableUri);
                    if (ig != null)
                    {
                        foreach (string s in ig.Split(' '))
                        {
                            node.IgnorablePrefixes.Add(s);
                        }
                    }

                    reader.MoveToFirstAttribute();

                    int count = 0;
                    do
                    {
                        // this filters out ignorable attributes
                        if (node.IgnorablePrefixes.Contains(reader.Prefix))
                        {
                            continue;
                        }

                        XamlAttribute ai = new XamlAttribute(reader)
                        {
                            Index = count++,
                        };

                        // an x: or equivalent attribute
                        ai.IsNsXaml = !ai.IsMapping && ai.NamespaceURI == XamlUri;
                        // an mc: or equivalent attribute (this attribute defines the list of ignorable prefixes)
                        ai.IsNsIgnorable = !ai.IsMapping && (ai.NamespaceURI == IgnorableUri || ai.Prefix == "mc");
                        // an xmlns:my='clr-namespace...' attribute
                        ai.IsNsClr = !ai.IsMapping && ai.NamespaceURI.StartsWith("clr-namespace");
                        if (ai.IsNsXaml && ai.LocalName == "Class")
                        {
                            node.Class = ai.Value;
                        }

                        if (ai.IsMapping)
                        {
                            if (node.top != node)
                            {
                                ai.Index = node.top.Attributes.Count;
                            }
                            node.top.Attributes [reader.Name] = ai;
                        }
                        else
                        {
                            if (ai.IsNsXaml)
                            {
                                if (ai.LocalName == "Key")
                                {
                                    node.X_Key = ai.Value;
                                }
                                else if (ai.LocalName == "Name")
                                {
                                    node.X_Name = ai.Value;
                                }
                            }
                            node.Attributes [reader.Name] = ai;
                        }
                    } while (reader.MoveToNextAttribute());

                    reader.MoveToElement();
                }

                node.Initialized = true;
            }

            if (evstart != null && (node.NodeType == XmlNodeType.Element || node.NodeType == XmlNodeType.Text))
            {
                evstart(node);
            }

            if (evattr != null)
            {
                foreach (XamlAttribute ai in node.Attributes.Values.Where(x => !x.IsNsIgnorable && !x.IsMapping))
                {
                    evattr(node, ai);
                }
            }

            if (node.Ignore)
            {
                node.outerXml         = reader.ReadOuterXml();
                cache [node.outerXml] = node;
                if (evend != null && node.NodeType == XmlNodeType.Element)
                {
                    evend(node);
                }
                return(node);
            }

            if (node.NodeType == XmlNodeType.Element && !node.IsEmptyElement)
            {
                XamlNode child = null;
                do
                {
                    child = Parse(reader, node, null, evstart, evend, evattr, child != null ? child.Ignore : false);
                    if (child != null)
                    {
                        child.Parsed = !child.Ignore;
                        node.Children.Add(child);
                    }
                } while (child != null);
            }

            if (evend != null && node.NodeType == XmlNodeType.Element)
            {
                evend(node);
            }

            return(node);
        }
Exemplo n.º 11
0
        public void Parse(NodeEvent evstart, NodeEvent evend, AttributeEvent evattr)
        {
#if LOGGING
            Log("Looping: Ignored? {0} Parsed? {1} {2}", this.Ignore, this.Parsed, outerXml);
#endif
            Ignore = false;

            if (!Initialized)
            {
                XmlReader reader = XmlReader.Create(new StringReader(outerXml));
                Parse(reader, parent, this, evstart, evend, evattr);
                Parsed = !Ignore;
                return;
            }

            if (evstart != null && (NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Text))
            {
                evstart(this);
            }

            if (evattr != null)
            {
                foreach (XamlAttribute ai in Attributes.Values.Where(x => !x.IsNsIgnorable && !x.IsMapping))
                {
                    evattr(this, ai);
                }
            }

            if (NodeType == XmlNodeType.Element && !IsEmptyElement && !Ignore)
            {
                if (!Parsed)
                {
                    XmlReader reader = XmlReader.Create(new StringReader(outerXml));
                    reader.Read();
                    XamlNode child = null;
                    do
                    {
                        child = Parse(reader, this, null, evstart, evend, evattr, child != null ? child.Ignore : false);
                        if (child != null)
                        {
                            child.Parsed = !child.Ignore;
                            Children.Add(child);
                        }
                    } while (child != null);
                    Parsed = true;
                }
                else
                {
                    foreach (XamlNode child in Children)
                    {
                        child.Parse(evstart, evend, evattr);
                    }
                }
            }

            if (evend != null && NodeType == XmlNodeType.Element)
            {
                evend(this);
            }

            Ignore = false;
        }
Exemplo n.º 12
0
        private static void Main(string[] args)
        {
            Setup();

            while (true)
            {
                Console.WriteLine("Enter message (or quit to exit)");
                Console.Write("> ");
                var value = Console.ReadLine();

                if ("quit".Equals(value, StringComparison.OrdinalIgnoreCase))
                {
                    break;
                }

                var message = new HpImplementation {
                    SystemVersion = value + "-" + DateTime.Now
                };
                if ("send".Equals(value, StringComparison.OrdinalIgnoreCase))
                {
                    _bus.Send("MassTransit.Tests.Consumer", message);
                }
                else if ("rr" == value)
                {
                    using (var scope = ObjectContainer.BeginLifetimeScope())
                    {
                        var client = scope.Resolve <ESS.FW.Common.ServiceBus.IRequestClient <Request, RequestResult> >();
                        Task.Run(() =>
                        {
                            var result =
                                client.Request("MassTransit.Tests.Consumer",
                                               new Request {
                                Message = "request"
                            }, new CancellationToken()).Result;
                            Console.WriteLine(result.Message);
                        });
                    }
                }
                //else if ("trans" == value)
                //    _bus.Publish(new TransactionEvent { Message = "transaction test" });
                else if ("order" == value)
                {
                    for (var i = 0; i < 100; i++)
                    {
                        _bus.Send("MassTransit.Tests.Consumer",
                                  new HpImplementation {
                            SystemVersion = i + "-" + DateTime.Now
                        }, true);
                    }
                }
                //else if ("orderp" == value)
                //    for (var i = 0; i < 100; i++)
                //        _bus.OrderPublish(
                //            new HpImplementation { SystemVersion = i + "-" + DateTime.Now });
                else if ("attr" == value)
                {
                    var msg = new AttributeEvent();
                    msg.Message = DateTime.Now.ToString();
                    _bus.Send("AttributeEvent", msg, true);
                }
                else
                {
                    _bus.Send("MassTransit.Tests.Consumer", message, true);
                }
            }

            Console.ReadKey();
        }
Exemplo n.º 13
0
 /// <summary>
 /// Checks whether an attribute is an property attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an property attribute</returns>
 public static bool IsPropertyAttribute(AttributeEvent attr)
 {
     //QName must be a valid Property Attribute Uri
     //Any string value allowed so if Uri test is true then we're a property Attribute
     return IsPropertyAttributeURI(attr.QName);
 }
Exemplo n.º 14
0
 /// <summary>
 /// Checks whether an attribute is an rdf:parseType attribute.
 /// </summary>
 /// <param name="attr">Attribute to Test.</param>
 /// <param name="nsMapper">The namespace prefix mappings to use when expanding the namespace prefix of the attribute.</param>
 /// <returns>True if is an rdf:parseType attribute.</returns>
 public static bool IsParseTypeAttribute(AttributeEvent attr, INestedNamespaceMapper nsMapper)
 {
     return(nsMapper.HasNamespace(attr.Namespace) &&
            nsMapper.GetNamespaceUri(attr.Namespace).ToString().Equals(NamespaceMapper.RDF) &&
            attr.LocalName.Equals("parseType"));
 }
Exemplo n.º 15
0
 /// <summary>
 /// Checks whether an attribute is an rdf:type attribute.
 /// </summary>
 /// <param name="attr">The attribute to check.</param>
 /// <param name="nsMapper">The namespace prefix mappings to use to expand QNames.</param>
 /// <returns>True if the attribute is and rdf:type attribute, false otherwise.</returns>
 public static bool IsTypeAttribute(AttributeEvent attr, INamespaceMapper nsMapper)
 {
     return(nsMapper.HasNamespace(attr.Namespace) &&
            IsRdfNamespace(nsMapper.GetNamespaceUri(attr.Namespace)) &&
            attr.LocalName.Equals("type"));
 }
Exemplo n.º 16
0
 /// <summary>
 /// Checks whether an attribute is an property attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an property attribute</returns>
 public static bool IsPropertyAttribute(AttributeEvent attr)
 {
     //QName must be a valid Property Attribute Uri
     //Any string value allowed so if Uri test is true then we're a property Attribute
     return(IsPropertyAttributeURI(attr.QName));
 }
Exemplo n.º 17
0
		public static XamlNode Parse (string xml, NodeEvent evstart, NodeEvent evend, AttributeEvent evattr)
		{
			XamlNode root;
			bool exists = cache.TryGetValue (xml, out root);
			if (!exists)
				root = new XamlNode () { outerXml = xml };
			root.Parse (evstart, evend, evattr);
			if (!exists)
				cache[xml] = root;
			return root;
		}
Exemplo n.º 18
0
 /// <summary>
 /// Checks whether an attribute is an rdf:nodeID attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:nodeID attribute</returns>
 /// <remarks>Does some validation on ID value but other validation occurs in the <see cref="ValidateID()">ValidateID</see> method which is called at other points in the Parsing</remarks>
 public static bool IsNodeIDAttribute(AttributeEvent attr)
 {
     //QName must be rdf:nodeID
     if (attr.QName.Equals("rdf:nodeID"))
     {
         //Must be a valid RDF ID
         if (IsRdfID(attr.Value))
         {
             //OK
             return true;
         }
         else
         {
             //Invalid RDF ID so Error
             throw ParserHelper.Error("The value '" + attr.Value + "' for rdf:id is not valid, RDF IDs can only be valid NCNames as defined by the W3C XML Namespaces specification", attr);
         }
     }
     else
     {
         return false;
     }
 }
Exemplo n.º 19
0
		public void Parse (NodeEvent evstart, NodeEvent evend, AttributeEvent evattr)
		{
#if LOGGING
			Log ("Looping: Ignored? {0} Parsed? {1} {2}", this.Ignore, this.Parsed, outerXml);
#endif
			Ignore = false;

			if (!Initialized) {
				XmlReader reader = XmlReader.Create (new StringReader (outerXml));
				Parse (reader, parent, this, evstart, evend, evattr);
				Parsed = !Ignore;
				return;
			}

			if (evstart != null && (NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Text))
				evstart (this);
			
			if (evattr != null) {
				foreach (XamlAttribute ai in Attributes.Values.Where (x => !x.IsNsIgnorable && !x.IsMapping))
					evattr (this, ai);
			}

			if (NodeType == XmlNodeType.Element && !IsEmptyElement && !Ignore) {
				if (!Parsed) {
					XmlReader reader = XmlReader.Create (new StringReader (outerXml));
					reader.Read ();
					XamlNode child = null;
					do {
						child = Parse (reader, this, null, evstart, evend, evattr, child != null ? child.Ignore : false);
						if (child != null) {
							child.Parsed = !child.Ignore;
							Children.Add (child);
						}
					} while (child != null);
					Parsed = true;
				} else {
					foreach (XamlNode child in Children) {
						child.Parse (evstart, evend, evattr);
					}
				}
			}

			if (evend != null && NodeType == XmlNodeType.Element)
				evend (this);
			
			Ignore = false;
		}
Exemplo n.º 20
0
 /// <summary>
 /// Checks whether an attribute is an rdf:datatype attribute
 /// </summary>
 /// <param name="attr">Attribute to Test</param>
 /// <returns>True if is an rdf:datatype attribute</returns>
 public static bool IsDataTypeAttribute(AttributeEvent attr)
 {
     //QName must be rdf:datatype
     if (attr.QName.Equals("rdf:datatype"))
     {
         //Must be a valid RDF Uri Reference
         return IsRdfUriReference(attr.Value);
     }
     else
     {
         return false;
     }
 }
Exemplo n.º 21
0
		/**
		@node If it's not null, it probably means we're on the top node and just
				got called from public Parse method
		@parent If it's null, it means we're on the top node
		@skip don't do a read, we're already on the next node and ready to process it

		If this method returns null, it means it has reached the end of the current
		xml subtree (the end element of the parent node)
		**/
		static XamlNode Parse (XmlReader reader, XamlNode parent, XamlNode node, 
								NodeEvent evstart, NodeEvent evend, 
								AttributeEvent evattr, bool skip = false)
		{
			if (!skip)
				reader.Read ();

			if (parent == null) {
				while (reader.NodeType != XmlNodeType.Element)
					if (!reader.Read ())
						return null;
			} else {
				do {
					while (reader.NodeType != XmlNodeType.Element &&
						   reader.NodeType != XmlNodeType.EndElement &&
						   reader.NodeType != XmlNodeType.Text) {
						if (!reader.Read ())
							return null;
					}
					if (reader.NodeType == XmlNodeType.Element &&
						parent.top.IgnorablePrefixes.Contains (reader.Prefix))
						reader.Skip ();
					else
						break;
				} while (true);
			}

			if (reader.NodeType == XmlNodeType.EndElement)
				return null;

			if (node == null)
				node = new XamlNode ();

			node.Parsed = false;
			node.Ignore = false;

			if (!node.Initialized) {
				node.parent = parent;

				if (parent != null)
					node.top = parent.top;
				else {
					node.ignorablePrefixes = new List<string> ();
					node.top = node;
				}

				node.type = reader.NodeType;
				node.namespaceURI = reader.NamespaceURI;
				node.prefix = reader.Prefix;
				node.name = reader.Name;
				node.localName = reader.LocalName;
				node.IsEmptyElement = reader.IsEmptyElement;
				node.HasValue = reader.HasValue;
				node.XmlSpace = reader.XmlSpace;
				node.LineNumber = -1;
				node.LinePosition = -1;
				node.IsNsXaml = node.NamespaceURI == XamlUri;
				node.IsNsClr = node.NamespaceURI.StartsWith ("clr-namespace");
				if (parent == null)
					node.DefaultXmlns = reader.GetAttribute ("xmlns");

				if (node.IsNsClr) {
					int end = node.NamespaceURI.IndexOf (';');
					if (end == -1)
						end = node.NamespaceURI.Length;
					node.ClrNamespace = node.NamespaceURI.Substring (14, end - 14);
				}

				if (node.IsNsClr && node.NamespaceURI.IndexOf (";assembly=") + 10 < node.NamespaceURI.Length)
					node.Assembly = node.NamespaceURI.Substring (node.NamespaceURI.IndexOf (";assembly=") + 10);

				if (node.HasValue)
					node.val = reader.Value;


				IXmlLineInfo linfo = reader as IXmlLineInfo;
				if (linfo != null) {
					node.LineNumber = linfo.LineNumber;
					node.LinePosition = linfo.LinePosition;
				}

				if (reader.HasAttributes) {
					string ig = reader.GetAttribute ("Ignorable", IgnorableUri);
					if (ig != null) {
						foreach (string s in ig.Split (' '))
							node.IgnorablePrefixes.Add (s);
					}

					reader.MoveToFirstAttribute ();

					int count = 0;
					do {
						// this filters out ignorable attributes
						if (node.IgnorablePrefixes.Contains (reader.Prefix))
							continue;

						XamlAttribute ai = new XamlAttribute (reader) {
							Index = count++,
						};

						// an x: or equivalent attribute
						ai.IsNsXaml = !ai.IsMapping && ai.NamespaceURI == XamlUri;
						// an mc: or equivalent attribute (this attribute defines the list of ignorable prefixes)
						ai.IsNsIgnorable = !ai.IsMapping && (ai.NamespaceURI == IgnorableUri || ai.Prefix == "mc");
						// an xmlns:my='clr-namespace...' attribute
						ai.IsNsClr = !ai.IsMapping && ai.NamespaceURI.StartsWith ("clr-namespace");
						if (ai.IsNsXaml && ai.LocalName == "Class")
							node.Class = ai.Value;

						if (ai.IsMapping) {
							if (node.top != node)
								ai.Index = node.top.Attributes.Count;
							node.top.Attributes [reader.Name] = ai;
						} else {
							if (ai.IsNsXaml) {
								if (ai.LocalName == "Key")
									node.X_Key = ai.Value;
								else if (ai.LocalName == "Name")
									node.X_Name = ai.Value;
							}
							node.Attributes [reader.Name] = ai;
						}
					} while (reader.MoveToNextAttribute ());

					reader.MoveToElement ();
				}
			
				node.Initialized = true;
			}

			if (evstart != null && (node.NodeType == XmlNodeType.Element || node.NodeType == XmlNodeType.Text))
				evstart (node);

			if (evattr != null) {
				foreach (XamlAttribute ai in node.Attributes.Values.Where (x => !x.IsNsIgnorable && !x.IsMapping))
					evattr (node, ai);
			}

			if (node.Ignore) {
				node.outerXml = reader.ReadOuterXml ();
				cache [node.outerXml] = node;
				if (evend != null && node.NodeType == XmlNodeType.Element)
					evend (node);
				return node;				
			}

			if (node.NodeType == XmlNodeType.Element && !node.IsEmptyElement) {
				XamlNode child = null;
				do {
					child = Parse (reader, node, null, evstart, evend, evattr, child != null ? child.Ignore : false);
					if (child != null) {
						child.Parsed = !child.Ignore;
						node.Children.Add (child);
					}
				} while (child != null);
			}

			if (evend != null && node.NodeType == XmlNodeType.Element)
				evend (node);

			return node;
		}