When you add printing value of staff node, it turns out that it has the value of the last nested node (bio):
@Override
public void endElement(String uri,
String localName,
String qName) {
...
if (qName.equalsIgnoreCase("staff")) {
System.out.printf("staff : %s%n", currentValue.toString());
}
}
console before:
End Element : bio
Bio : HTML tag <code>testing</code>
End Element : staff
Start Element : staff
Staff id : 1002
console after:
Bio : HTML tag <code>testing</code>
End Element : staff
staff : HTML tag <code>testing</code>
Start Element : staff
Staff id : 1002