Это из FAQ по Xerces.
Почему парсер SAX теряет некоторые символьные данные или почему данные разбиваются на несколько частей?Если вы прочтете документацию SAX, то обнаружите, что SAX может доставлять непрерывный текст в виде нескольких вызовов символов по причинам, связанным с эффективностью синтаксического анализатора и буферизацией ввода.Программист несет ответственность за то, чтобы справиться с этим надлежащим образом, например, путем накопления текста до следующего не символьного события.
Ваш код очень хорошо адаптирован из одного из многих учебных пособий по синтаксическому анализу XML (например, этот один здесь) Теперь учебник хорош и все, но они не упоминают что-то очень важное ...
Обратите внимание на эту часть здесь ...
public void characters(char[] ch, int start, int length)
throws SAXException
{
if(in_ThisTag){
myobj.setName(new String(ch,start,length))
}
}
Могу поспорить, что в этот момент вы проверяете логические значения, чтобы отметить, под каким тегом вы находитесь, а затем устанавливаете значение в какой-то class
, которую вы сделали?или что-то в этом роде ...
Но проблема в том, что синтаксический анализатор SAX (который буферизован) не обязательно будет получать все символы между тегами за один раз .... скажем, если <tag> Lorem Ipsum...really long sentence...</tag>
так что ваш синтаксический анализатор SAX вызывает characters
функция - это чанки ....
Итак, хитрость заключается в том, чтобы продолжать добавлять значения в строковую переменную и фактически set
(или фиксировать) ее в вашей структуре.когда тэг заканчивается ... (т.е. в endElement
)
Пример
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentElement = false;
/** set value */
if (localName.equalsIgnoreCase("tag"))
{
sitesList.setName(currentValue);
currentValue = ""; //reset the currentValue
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (in_Tag) {
currentValue += new String(ch, start, length); //keep appending string, don't set it right here....maybe there's more to come.
}
}
Кроме того, было бы лучше, если вы добавите StringBuilder
для добавления, так как это будетбыть более эффективным ....
Надеюсь, это имеет смысл!Если он не проверял , это и здесь