public override bool MoveToAttribute( string name ) {
int depth;
XPathNavigator nav = GetElemNav(out depth);
if (null == nav)
return false;
string prefix, localname;
ValidateNames.SplitQName( name, out prefix, out localname );
// watch for a namespace name
bool IsXmlnsNoPrefix = false;
if ( ( IsXmlnsNoPrefix = ( 0 == prefix.Length && localname == "xmlns" ) )
|| ( prefix == "xmlns" ) ) {
if ( IsXmlnsNoPrefix )
localname = string.Empty;
if ( nav.MoveToFirstNamespace(XPathNamespaceScope.Local) ) {
do {
if (nav.LocalName == localname)
goto FoundMatch;
} while ( nav.MoveToNextNamespace(XPathNamespaceScope.Local) );
}
}
else if ( 0 == prefix.Length ) {
// the empty prefix always means empty namespaceUri for attributes
if ( nav.MoveToAttribute( localname, string.Empty ) )
goto FoundMatch;
}
else {
if ( nav.MoveToFirstAttribute() ) {
do {
if (nav.LocalName == localname && nav.Prefix == prefix)
goto FoundMatch;
} while (nav.MoveToNextAttribute());
}
}
return false;
FoundMatch:
if ( state == State.InReadBinary ) {
readBinaryHelper.Finish();
state = savedState;
}
MoveToAttr(nav, depth+1);
return true;
}