public static string RefineSingleElement(string elemName)
{
if (elemName == null)
return null;
elemName = elemName.Trim(' ', '\t', '\r', '\n', '\v', '/', '\\');
if (IsSingleLocationGeneric(elemName))
{
return elemName;
}
else if (LooksLikeExpandedXName(elemName))
{
// thanks go to CodePlex user: tg73 (http://www.codeplex.com/site/users/view/tg73)
// for providing the code for expanded xml name support
// XName permits strings of the form '{namespace}localname'. Detecting such cases allows
// YAXLib to support explicit namespace use.
// http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx
// Leave namespace part alone, refine localname part.
int closingBrace = elemName.IndexOf( '}' );
string refinedLocalname = RefineSingleElement( elemName.Substring( closingBrace + 1 ) );
return elemName.Substring( 0, closingBrace + 1 ) + refinedLocalname;
}
else
{
var sb = new StringBuilder(elemName.Length);
// This uses the rules defined in http://www.w3.org/TR/xml/#NT-Name.
// Thanks go to [@asbjornu] for pointing to the W3C standard
for (int i = 0; i < elemName.Length; i++)
{
if (i == 0)
sb.Append(IsValidNameStartChar(elemName[i]) ? elemName[i] : '_');
else
sb.Append(IsValidNameChar(elemName[i]) ? elemName[i] : '_');
}
return sb.ToString();
}
}