The NewsParser Class
The server returns "raw" news to the mobile device, which must be parsed to extract the titles and descriptions. NewsParser is the class responsible for doing that. Here's the code:
class NewsParser {
private String rawNews;
private int index;
public NewsParser(String rawNews) {
this.rawNews = rawNews;
this.index = 0;
}
public Vector parse() {
Vector v = new Vector();
if(rawNews =="")
return v;
//extract the news
while(index < rawNews.length()) {
//extract the title
String title = extractText(index, "t");
//extract the description
String description = extractText(index, "d");
News news = new News(title, description);
v.addElement(news);
}
return v;
}
//extract the text (a title or a description
//depending on the type parameter)
private String extractText(int beginIndex, String type) {
String startTag = "<" + type + ">";
String endTag = "</" + type + ">";
//find the index of startTag in rawNews, starting
//from beginIndex
int begin = rawNews.indexOf(startTag, beginIndex);
//move 3 chars ahead to point to the beginning of
//the actual text (title or descr.)
begin += 3;
//find the index of endTag in rawNews,
//starting from begin
int end = rawNews.indexOf(endTag, begin);
//update index
index = end + 4;
//return the actual text representing a title
//or a description
return rawNews.substring(begin, end);
}
}
The
parse method performs the actual parsing. This method returns a Vector of News objects. NewsParser has two fields:
rawNews and
index. The former is the string representing the news downloaded from the server. The latter represents a pointer to the character position within
rawNews where the parse method begins looking for the next title and description. Here's an example to clarify. Suppose
rawNews is:
<t>A new article has been published on DevX.com</t><d>This
article deals with J2ME, PHP and their interaction</d><t>Funny
saying</t><d>There are only 10 types of people in the world:
those who understand binary and those who don't!</d>...
When you instantiate a NewsParser instance,
index points to the first char of
rawNews, which is "
<". When the
parse method gets called, it extracts titles and descriptions until it reaches the end of
rawNews. It accomplishes this using a helper method,
extractText, which receives
beginIndex and
type as parameters. The first represents the starting character index, which is constantly updated as the method moves through the raw input. The
type parameter represents the type of text to extract: "t" for title, or "d" for description. The
extractText method extracts the text, updates
index to the new value and returns the extracted text. For each title and description extracted, parse creates a News object and adds it to the vector. Finally it returns the vector to the
getNews method.
This article has described how J2ME and PHP can interact. As a proof of concept, you have seen how to build a pretty useful application that allows a user to get the latest news from the Web. Of course, you could improve the simple
sample project, for example by storing the information retrieved from the Web on the mobile device using RMS (Record Management System). But that's another story.