Esempio n. 1
0
		private void StartTag(byte[] buf, int offset,
			ContentToken ct, TOK tok)
		{
			m_Depth++;
			int colon;
			string name;
			string prefix;
			Hashtable ht = new Hashtable();
            
			m_NamespaceStack.Push();
            
			// if i have attributes
			if ((tok == TOK.START_TAG_WITH_ATTS) ||
				(tok == TOK.EMPTY_ELEMENT_WITH_ATTS))
			{
				int start;
				int end;
				string val;
				for (int i=0; i<ct.getAttributeSpecifiedCount(); i++)
				{                    
					start =  ct.getAttributeNameStart(i);
					end = ct.getAttributeNameEnd(i);
					name = utf.GetString(buf, start, end - start);
                    
					start = ct.getAttributeValueStart(i);
					end =  ct.getAttributeValueEnd(i);
					//val = utf.GetString(buf, start, end - start);

                    val = NormalizeAttributeValue(buf, start, end - start);
                    // <foo b='&amp;'/>
					// <foo b='&amp;amp;'
					// TODO: if val includes &amp;, it gets double-escaped
					if (name.StartsWith("xmlns:"))
					{
						colon = name.IndexOf(':');
						prefix = name.Substring(colon+1);
						m_NamespaceStack.AddNamespace(prefix, val);
					}
					else if (name == "xmlns")
					{
                        m_NamespaceStack.AddNamespace(string.Empty, val);						
					}
					else
					{
						ht.Add(name, val);
					}
				}
			}

			name = utf.GetString(buf,
				offset + m_enc.MinBytesPerChar,
				ct.NameEnd - offset - m_enc.MinBytesPerChar);
			
            colon = name.IndexOf(':');
			string ns = "";
			prefix = null;
			if (colon > 0)
			{
				prefix = name.Substring(0, colon);
				name = name.Substring(colon + 1);
				ns = m_NamespaceStack.LookupNamespace(prefix);
			}
			else
			{
				ns = m_NamespaceStack.DefaultNamespace;
			}
            			
			Element newel = ElementFactory.GetElement(prefix, name, ns);
			
			foreach (string attrname in ht.Keys)
			{
				newel.SetAttribute(attrname, (string)ht[attrname]);                
			}
            
			if (m_root == null)
			{
				m_root = newel;
				//FireOnDocumentStart(m_root);
				if (OnStreamStart!=null)
					OnStreamStart(this, m_root);
			}
			else
			{
				if (current != null)
					current.AddChild(newel);
				current = newel;
			}
		}