How to parse a generic XML file in J2ME with kXML
Some days ago I’ve posted J2ME code to parse RSS feeds using kXML library. Today’s code is about parsing a generic XML, so you can use it to parse any XML document you want. Code is splitted in the following two classes.
XmlNode class
This is the class representing a single node. We’ll define 2 node types:
- Text nodes: nodes without a name, contanining only a textual value. For them we’ll define a TEXT_NODE final variable
- Element nodes: nodes with a tag name, that can have children nodes and/or attributes
XmlNode class source code is available here: XmlNode.java
GenericXmlParser class
This is the class that will actually do XML parsing. We’ll define only one public method, parseXML(), that will accept 2 arguments:
- a KXmlParser instance, that will be used to do XML parsing
- a boolean that will tell if whitespace-only text nodes must be ignored or not
and will return and XmlNode representing the root node of the parsed XML tree.
GenericXmlParser class source code is available here: GenericXmlParser.java
Sample usage
Let’s see how we can use the two classes above. First we must instantiate and initialize a KXmlParser, and then we can call our GenericXmlParser parseXML() method.
InputStreamReader reader = new InputStreamReader(getClass().getResourceAsStream("/test3.xml")); KXmlParser parser = new KXmlParser(); parser.setInput(reader); GenericXmlParser gParser = new GenericXmlParser(); XmlNode xml = gParser.parseXML(parser, true); |
Now, we have our resulting XmlNode that will hold the whole XML tree. We can make a simple dump of it to check if it’s all ok, using this test function:
void dumpXML(XmlNode node, int deep) { for(int i = 0; i < deep; i++) { System.out.print(" "); } System.out.print(node.nodeName + " - "); if(node.nodeValue != null) { System.out.print("(" + node.nodeValue + ") - "); } String[] attributes = node.getAttributeNames(); for(int i = 0; i < attributes.length; i++) { System.out.print(attributes[i] + ": " + node.getAttribute(attributes[i]) + ", "); } System.out.println(); for(int i = 0; i < node.children.size(); i++) { dumpXML((XmlNode)node.children.elementAt(i), deep + 1); } } |
Note: This article is available also on Forum Nokia Wiki: How to parse an XML file in J2ME with kXML
Reply