Skip to main content

skip to main content

developerWorks  >  XML  >

Tip: Achieving vendor independence with SAX

How to use SAX and a SAX helper class to achieve vendor independence

developerWorks
Document options

Document options requiring JavaScript are not displayed


Rate this page

Help us improve this content


Level: Introductory

Brett McLaughlin (brett@newInstance.com), Enhydra strategist, Lutris Technologies

01 Mar 2001

While newer XML developers are learning to achieve vendor independence with JAXP, SAX veterans have been vendor neutral for years. This tip explains how to use SAX and a SAX helper class to achieve vendor independence in your SAX-based applications.

With the recent surge of interest in, and resources for, JAXP (the Java API for XML Parsing, which you can learn more about through the Resources section), you may have forgotten that SAX, DOM, and JDOM have been around for quite a while. In fact, many developers (maybe even you) use SAX, DOM, or JDOM without even touching JAXP.

While JDOM has a well-known, standard way of handling various parsers, and DOM has no facility for this at all prior to the DOM Level 3 version, SAX remains a bit of a mystery to many developers. Many programmers write SAX code that is neither portable nor vendor independent. The result is that they lock their applications into a specific parser -- sometimes a specific version of a parser. In this tip, I explain how you can make your life easier by using a SAX helper class to free your code from this dependence on a specific vendor class.

The foundation for all SAX programming is an instance of a SAXParser implementation. The most common means of parsing XML using SAX is simply to instantiate the vendor-provided implementation class. Listing 1 shows this methodology in action.

Of course, the problem with Listing 1 is that, in order to change parsers, you have to change the implementation class. And that might mean adding or removing import statements, and ... you get the idea. Suddenly, you are spending your coffee breaks modifying code and recompiling instead of drinking coffee! Lots of problems can result, to say the least. Changing from one SAX parser to another, however, shouldn't be such an ordeal. SAX provides developers a better option. Unfortunately, a lot of programmers miss out on it.

To make it easier to swap parsers, consider using the org.xml.sax.helpers.XMLReaderFactory helper class. This class provides a handy factory for taking a class name and then generating an instance of the provided class. If you have done much work with Java, you may recognize that this is similar to Class.forName(String className).newInstance(). So, instead of using code like that shown in Listing 1, you should code as shown in Listing 2.

In Listing 2, changing parser implementations simply involves changing a single class name. And that's a pretty safe change, since it involves merely modifying a String value. This is much better than the messy imports and code changes from Listing 1, wouldn't you say? The one drawback is that, when changing the parser, you still have to make some changes to your code. And that's not perfect. So, instead of hard coding in this string, you might want to use Java system properties to handle the class to load. This would allow specification of the parser class to your application either through a command-line argument (using the Java -D argument) or through a simple Java properties file. And, as if SAX weren't easy enough, the XMLReaderFactory class provides this functionality "out of the box." If no argument is specified to the createXMLReader() method, the method will look for a class specified as the value of the system property org.xml.sax.driver. You don't even have to do any work of your own! The code in Listing 2 then is modified to that in Listing 3.

Now, if you follow the method in Listing 3, your SAX code can hum along without even having to be recompiled, using different parser implementations as needed. Of course, if you're using JAXP, this approach isn't needed. But if you're a hardcore SAX person, then this tip will help you write code that's a little more portable a little more efficiently. And if you're using JAXP, you might want to check out my articles on the subject (see Resources). So code away, but be smart about it!



Resources



About the author

Brett McLaughlin (brett@newInstance.com) works as Enhydra strategist at Lutris Technologies and specializes in distributed systems architecture. He is author of Java and XML (O'Reilly). He is involved in technologies such as Java servlets, Enterprise JavaBeans technology, XML, and business-to-business applications. Along with Jason Hunter, he founded the JDOM project, which provides a simple API for manipulating XML from Java applications. He is also an active developer on the Apache Cocoon project and the EJBoss EJB server as well as a co-founder of the Apache Turbine project.




Rate this page


Please take a moment to complete this form to help us better serve you.



 


 


Not
useful
Extremely
useful
 


Share this....

digg Digg this story del.icio.us del.icio.us Slashdot Slashdot it!



Back to top