public override void WriteEndAttribute()
{
try
{
AdvanceState(Token.EndAttribute);
if (_specAttr != SpecialAttribute.No)
{
string value;
switch (_specAttr)
{
case SpecialAttribute.DefaultXmlns:
value = _attrValueCache.StringValue;
if (PushNamespaceExplicit(string.Empty, value))
{ // returns true if the namespace declaration should be written out
if (_rawWriter != null)
{
if (_rawWriter.SupportsNamespaceDeclarationInChunks)
{
_rawWriter.WriteStartNamespaceDeclaration(string.Empty);
_attrValueCache.Replay(_rawWriter);
_rawWriter.WriteEndNamespaceDeclaration();
}
else
{
_rawWriter.WriteNamespaceDeclaration(string.Empty, value);
}
}
else
{
_writer.WriteStartAttribute(string.Empty, "xmlns", XmlReservedNs.NsXmlNs);
_attrValueCache.Replay(_writer);
_writer.WriteEndAttribute();
}
}
_curDeclPrefix = null;
break;
case SpecialAttribute.PrefixedXmlns:
value = _attrValueCache.StringValue;
if (value.Length == 0)
{
throw new ArgumentException(SR.Xml_PrefixForEmptyNs);
}
if (value == XmlReservedNs.NsXmlNs || (value == XmlReservedNs.NsXml && _curDeclPrefix != "xml"))
{
throw new ArgumentException(SR.Xml_CanNotBindToReservedNamespace);
}
if (PushNamespaceExplicit(_curDeclPrefix, value))
{ // returns true if the namespace declaration should be written out
if (_rawWriter != null)
{
if (_rawWriter.SupportsNamespaceDeclarationInChunks)
{
_rawWriter.WriteStartNamespaceDeclaration(_curDeclPrefix);
_attrValueCache.Replay(_rawWriter);
_rawWriter.WriteEndNamespaceDeclaration();
}
else
{
_rawWriter.WriteNamespaceDeclaration(_curDeclPrefix, value);
}
}
else
{
_writer.WriteStartAttribute("xmlns", _curDeclPrefix, XmlReservedNs.NsXmlNs);
_attrValueCache.Replay(_writer);
_writer.WriteEndAttribute();
}
}
_curDeclPrefix = null;
break;
case SpecialAttribute.XmlSpace:
_attrValueCache.Trim();
value = _attrValueCache.StringValue;
if (value == "default")
{
_elemScopeStack[_elemTop].xmlSpace = XmlSpace.Default;
}
else if (value == "preserve")
{
_elemScopeStack[_elemTop].xmlSpace = XmlSpace.Preserve;
}
else
{
throw new ArgumentException(SR.Format(SR.Xml_InvalidXmlSpace, value));
}
_writer.WriteStartAttribute("xml", "space", XmlReservedNs.NsXml);
_attrValueCache.Replay(_writer);
_writer.WriteEndAttribute();
break;
case SpecialAttribute.XmlLang:
value = _attrValueCache.StringValue;
_elemScopeStack[_elemTop].xmlLang = value;
_writer.WriteStartAttribute("xml", "lang", XmlReservedNs.NsXml);
_attrValueCache.Replay(_writer);
_writer.WriteEndAttribute();
break;
}
_specAttr = SpecialAttribute.No;
_attrValueCache.Clear();
}
else
{
_writer.WriteEndAttribute();
}
}
catch
{
_currentState = State.Error;
throw;
}
}