import gnu.xml.NodeTree; //导入方法依赖的package包/类
public static boolean deepEqual (NodeTree seq1, int ipos1,
NodeTree seq2, int ipos2,
NamedCollator collator)
{
int kind1 = seq1.getNextKind(ipos1);
int kind2 = seq2.getNextKind(ipos2);
switch (kind1)
{
case Sequence.ELEMENT_VALUE:
if (kind1 != kind2)
return false;
// Assumes local-name and namespace-URI are interned.
String loc1 = seq1.posLocalName(ipos1);
String loc2 = seq2.posLocalName(ipos2);
if (loc1 != loc2)
return false;
String ns1 = seq1.posNamespaceURI(ipos1);
String ns2 = seq2.posNamespaceURI(ipos2);
if (ns1 != ns2)
return false;
int attr1 = seq1.firstAttributePos(ipos1);
int nattr1 = 0;
for (;;)
{
if (attr1 == 0
|| seq1.getNextKind(attr1) != Sequence.ATTRIBUTE_VALUE)
break;
nattr1++;
String local = seq1.posLocalName(attr1);
String ns = seq1.posNamespaceURI(attr1);
int attr2 = seq2.getAttributeI(ipos2, ns, local);
if (attr2 == 0)
return false;
String aval1 = KNode.getNodeValue(seq1, attr1);
String aval2 = KNode.getNodeValue(seq2, attr2);
if (! deepEqualItems(aval1, aval2, collator))
return false;
attr1 = seq1.nextPos(attr1);
}
int nattr2 = seq2.getAttributeCount(ipos2);
if (nattr1 != nattr2)
return false;
/* ... fall through ... */
case Sequence.DOCUMENT_VALUE:
return deepEqualChildren(seq1, ipos1, seq2, ipos2, collator);
case Sequence.ATTRIBUTE_VALUE:
if (seq1.posLocalName(ipos1) != seq2.posLocalName(ipos2)
|| seq1.posNamespaceURI(ipos1) != seq2.posNamespaceURI(ipos2))
return false;
return deepEqualItems(KAttr.getObjectValue(seq1, ipos1),
KAttr.getObjectValue(seq2, ipos2),
collator);
case Sequence.PROCESSING_INSTRUCTION_VALUE:
if (! seq1.posTarget(ipos1).equals(seq2.posTarget(ipos2)))
return false;
return KNode.getNodeValue(seq1, ipos1)
.equals(KNode.getNodeValue(seq2, ipos2));
case Sequence.COMMENT_VALUE:
case Sequence.CDATA_VALUE:
default:
if (kind1 != kind2)
return false;
return KNode.getNodeValue(seq1, ipos1)
.equals(KNode.getNodeValue(seq2, ipos2));
}
}