Листинг 7.26. Начало кода класса TallyQues (TallyQues.java)
package com.XmlEcomBook.Chap07;
import java.io.* ; import java.util.* ; import org.w3c.dom.* ; import org.xml.sax.* ; import org.xml.sax.helpers.ParserFactory ; import com.sun.xml.parser.Resolver ;
/* org.xml.sax.HandlerBase is a convenience class that extends java.lang.Object and implements the SAX interfaces implements EntityResolver, DTDHandler, DocumentHandler, ErrorHandler */ public class TallyQues extends HandlerBase { static public String parserClass = "com.sun.xml.parser.Parser" ;
private Hashtable tally = new Hashtable(); // Counters keyed by unique // ordered has a Vector of Counters per question private Vector ordered = new Vector(); private Hashtable qtext = new Hashtable(); // <Qtext> by id
public String tableStyle = "align=\"center\" border=\"3\" " ; public String lastErr = null ; public int resultCt = 0 ; String id ; // <Ques> attribute "id" as detected during parse
// constructor creates the vectors and hashtables to store results // qd is the questionnaire source XML doc public TallyQues( Document qd ){ Element E = qd.getDocumentElement(); NodeList qnl = E.getElementsByTagName("Ques"); int ct = qnl.getLength(); for( int i = 0; i < ct ; i++ ){ Vector quesv = new Vector(); // for this <Ques> ordered.addElement( quesv ); E = (Element)qnl.item(i); // Element is a <Ques> NodeList txn = E.getElementsByTagName("Qtext"); String tx = txn.item(0).getFirstChild().getNodeValue(); // question text String id = E.getAttribute( "id" ); qtext.put( id, tx ); quesv.addElement( id ); // first element of quesv is the id NodeList opt = E.getElementsByTagName("Qopt"); int opct =opt.getLength(); for( int n = 0 ; n < opct ; n++ ){ Element opE = (Element) opt.item(n); String val = opE.getAttribute("val"); String text = opE.getFirstChild().getNodeValue(); Counter cntr = new Counter( id, val, text ); quesv.addElement( cntr ); tally.put( cntr.unique, cntr ); } } }
Обработка снимка опроса
Фактическая обработка файла, содержащего снимок результатов опроса, начинается с метода tallyAns. Как показано в листинге 7.27, работа этого метода состоит из следующих этапов.
Файл открывается как объект org.xml .InputSource.
Создается анализатор в соответствии со строкой parserClass (см. листинг 7.26). Мы используем анализатор из пакета Sun, но вы можете заменить его на любой подходящий вам анализатор.
Объект TallyQues присоединяется к анализатору, с тем чтобы он мог получать вызовы методов обработки событий.
Вызывается метод parse и начинается анализ.
Если не происходит никаких ошибок, то по выполнении метода parse таблица готова. Если происходит ошибка, метод tallyAns возвращает null, а если все прошло успешно, то возвращается переменная ordered.