private void ProcessAttributes(XmlAttributeNode[] attributeNodes, int attributeCount)
{
for (int i = 0; i < attributeCount; i++)
{
XmlAttributeNode attributeNode = attributeNodes[i];
if (attributeNode.QNameType == QNameType.Normal)
{
PrefixHandle prefix = attributeNode.Prefix;
if (!prefix.IsEmpty)
{
attributeNode.Namespace = LookupNamespace(prefix);
}
else
{
attributeNode.Namespace = NamespaceManager.EmptyNamespace;
}
attributeNode.AttributeText.Namespace = attributeNode.Namespace;
}
}
if (attributeCount > 1)
{
if (attributeCount < 12)
{
// For small numbers of attributes, a naive n * (n - 1) / 2 comparisons to check for uniqueness is faster
for (int i = 0; i < attributeCount - 1; i++)
{
XmlAttributeNode attributeNode1 = attributeNodes[i];
QNameType qnameType = attributeNode1.QNameType;
if (qnameType == QNameType.Normal)
{
for (int j = i + 1; j < attributeCount; j++)
{
XmlAttributeNode attributeNode2 = attributeNodes[j];
if (attributeNode2.QNameType == QNameType.Normal && attributeNode1.LocalName == attributeNode2.LocalName && attributeNode1.Namespace.Uri == attributeNode2.Namespace.Uri)
{
XmlExceptionHelper.ThrowDuplicateAttribute(this, attributeNode1.Prefix.GetString(), attributeNode2.Prefix.GetString(), attributeNode1.LocalName.GetString(), attributeNode1.Namespace.Uri.GetString());
}
}
}
else
{
DiagnosticUtility.DebugAssert(qnameType == QNameType.Xmlns, "");
for (int j = i + 1; j < attributeCount; j++)
{
XmlAttributeNode attributeNode2 = attributeNodes[j];
if (attributeNode2.QNameType == QNameType.Xmlns && attributeNode1.Namespace.Prefix == attributeNode2.Namespace.Prefix)
XmlExceptionHelper.ThrowDuplicateAttribute(this, xmlns, xmlns, attributeNode1.Namespace.Prefix.GetString(), xmlnsNamespace);
}
}
}
}
else
{
CheckAttributes(attributeNodes, attributeCount);
}
}
}