Листинг 9.14. Методы, которые поддерживают поиск заголовков по ключевым словам (NewsModel.java)
// return true if one of the keys appears //in the headline_text element private boolean searchArticle( Element aE, String[] keys ){ NodeList htNL = aE.getElementsByTagName("headline_text"); if( htNL.getLength() == 0 ) return false ; // there is only one headline_text Element htE = (Element)htNL.item(0); String str = getFullText( htE ).toUpperCase() ; for( int i = 0 ; i < keys.length ; i++ ){ if( str.indexOf( keys[i] ) > = 0 ) return true ; } return false ; } // this is needed to cope with headline text that has entities private String getFullText( Node nd ){ NodeList nl = nd.getChildNodes(); int ct = nl.getLength(); if( ct == 0 ) return ""; if( ct == 1 ) return nd.getFirstChild().getNodeValue(); StringBuffer sb = new StringBuffer(); for( int i = 0 ; i < ct ; i++ ){ Node n = nl.item(i); if( n instanceof EntityReference ){ // reconstruct & notation sb.append( '&' ); sb.append( n.getNodeName()); sb.append( ';' ); } else { sb.append( n.getNodeValue() ); } } return sb.toString(); }
Метод locateCategories (см. листинг 9.12) создал коллекцию clusterHash, в которой элементы (заголовки сообщений) хранятся в соответствии со своими тегами <cluster> . Мы не совсем понимаем, почему в Moreover.com этот элемент называется cluster (кластер) — нам кажется, что более подходящим названием для этого тега было бы topic (тема); поэтому метод, приведенный в листинге 9.15, называется articlesByTopic (статьи по темам). В этом листинге также показан метод getAllTopics, который просто превращает весь список узлов articleNodeList в массив типа Element.