Введение в SAX

Characters()


Теперь, когда вы получили элемент, пойдем дальше и выберем его данные при помощи characters(). Взглянем на сигнатуру этого метода:

public void characters(char[] ch, int start, int length)

Заметьте, что нигде в методе нет информации о том, частью какого элемента являются эти символы. Если вам нужна такая информация, вы должны сохранять ее. В этом примере добавлены переменные для сохранения информации о текущем элементе и вопросе. (Тут также удалено много лишней информации, которая отображалась.)

Заметьте две важные вещи:

  • Размер: Событие characters() содержит больше, чем просто строку символов. Оно также содержит информацию о начале и о длине. На самом деле массив ch содержит полный документ. Приложение не должно пытаться читать символы за пределами размера, переданного в событие characters().
  • Частота: В спецификации SAX нет требований к процессору возвращать символы каким-то определенным способом, так что возможно, чтобы одна порция текста возвращалась в нескольких кусках. Всегда прежде, чем считать, что вы имеете все содержимое элемента, убедитесь, что произошло событие endElement(). Процессор может также использовать ignorableWhitespace(), чтобы возвращать пропуски внутри элемента.

Это всегда учитывается проверяющим парсером.

... public void printIndent(int indentSize) { for (int s = 0; s < indentSize; s++) { System.out.print(" "); } } String thisQuestion = ""; String thisElement = "";

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (qName == "response") { System.out.println("User: " + atts.getValue("username")); } else if (qName == "question") { thisQuestion = atts.getValue("subject"); } thisElement = qName;

} public void endElement(String namespaceURI, String localName, String qName) throws SAXException { thisQuestion = ""; thisElement = "";

} public void characters(char[] ch, int start, int length) throws SAXException { if (thisElement == "question") { printIndent(4); System.out.print(thisQuestion + ": "); System.out.println(new String(ch, start, length)); } }

...



Содержание раздела