WBXML with J2ME
You've seen how to convert XML to WBXML and back, but you can also parse a WBXML stream directly—without first converting it to XML using the Java 2 Micro Edition (J2ME). Although the example is client-side code, the concepts discussed in this section are equally applicable to server side application development scenarios.
The J2ME application sends a WML file from a JSP web server to a J2ME client using an Open Source WAP gateway (JWAP, see the References column). The WAP gateway translates the WML file to WBXML before sending it over the air to the wireless J2ME client. The sample client-side application receives the WBXML data, parses it and displays useful information on the J2ME screen.
Look at the getConnect method in Listing 7. The method makes a Datagram request to the port for the JWAP server (the example uses datagram://127.0.0.1:9200) and sends it a hard coded Wireless Session Protocol (WSP) request. (Wireless Session Protocol is the wireless version of HTTP).
The JWAP gateway forwards the request to the destination Web server http://localhost:8080/examples/jsp/finalfiles/Dat.jsp in the example). When the JSP page in Listing 6 receives the request, it responds with a hard coded WML file containing the WML content-type encoding.
The JWAP gateway receives the WML file, converts it to WBXML on the fly and changes its content-type encoding to WBXML. It then forwards the WBXML stream to the J2ME client's getConnect method. The getConnect method forwards the data to another method, called getIncomingTextOfWmlc, which extracts information from the data. JWAP communicates using a WAP protocol stack, so it wraps the WBXML data with a WSP header that the getIncomingTextOfWmlc method discards (the WSP header content is not important for the purposes of this article).
After discarding the WSP header, the getIncomingTextOfWmlc method follows a four-step, event-based parsing mechanism using kXML:
- Create a WmlParser object, passing in the input stream holding the WBXML byte array to its constructor.
- Call the WmlParser's Read method The Readmethod throws the first event that it finds in the XML file.
- Read the event and check it if it's the one that you're looking for (in this example, you're looking for a start tag event containing a specific attribute).
- Repeat steps 2 and 3 in a loop.
The example in Listing 7 shows the process in its most basic form, but you can build comprehensive parsing mechanisms based on this very simple logic.
Using this method, you can use WBXML directly without first converting it to XML. You might be wondering whether kXML internally converts WBXML to XML before parsing. It doesn't. It parses WBXML directly without creating any XML stream. You can obtain the kXML source code, and I encourage you to do so and study it.
The WBXML file format significantly reduces the size of XML files, making it possible to use XML not only in WAP devices, but also in other Web-based programs that must send significant volumes of XML-formatted information over the wire.