Когда вы говорите, что Коровы неинициализированы, свойства String инициализируются нулем? Или пустые строки?
Я знаю, что вы упомянули, что это псевдокод, но я просто хотел указать на несколько потенциальных проблем:
public void startElement(...tag...)
{
if(tag == pluralcow){ // rule: there is only 1 pluralcow tag in the doc
// I happen to magically know how many cows there are here.
m_CowVec = new Vector(numcows);
}else if(tag == cow ){ // rule: multiple cow tags exist
m_WorkingCow = new Cow();
}else if(tag == color){ // rule: single color within cow
m_bColor = true;
}else if(tag == age){ // rule: single age within cow
m_bAge = true;
}
}
Вы действительно должны использовать tag.equals (...) вместо tag == ... здесь.
public void characters(...chars...)
{
if(m_bColor){
m_WorkingCow.setColor(chars);
}else if(m_bAge){
m_WorkingCow.setAge(chars);
}
}
Я предполагаю, что вы знаете об этом, но этот метод на самом деле вызывается с символьным буфером с начальным и конечным индексами.
Также обратите внимание, что символы (...) могут вызываться несколько раз для одного текстового блока, возвращая небольшие фрагменты в каждом вызове:
http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)
"... SAX-парсеры могут возвращать все смежные
символьные данные в одном блоке, или
они могут разбить его на несколько кусков ... "
Я сомневаюсь, что вы столкнетесь с этой проблемой в приведенном вами простом примере, но вы также упомянули, что это упрощенная версия более сложной проблемы. Если в вашей исходной задаче ваш XML состоит из больших текстовых блоков, это нужно учитывать.
Наконец, как уже упоминали другие, если вы могли бы, это хорошая идея рассмотреть библиотеку XML-маршалинга (например, JAXB, Castor, JIBX, XMLBeans, XStream и другие).