Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > SAX XMLReader, XMLFilter, ContentHandler and XMLWriter question

Reply
Thread Tools

SAX XMLReader, XMLFilter, ContentHandler and XMLWriter question

 
 
Jeff Calico
Guest
Posts: n/a
 
      02-22-2006
Hello all. I am implementing a SAX filter to strip a bunch of unneeded
elements out of a large XML file. I found a book "Java & XML" by Brett
McLaughlin, and an interesting article by him wich address my issues:
http://www-128.ibm.com/developerwork...ipbigdoc3.html

However, doing it in that specified way does not seem to work at all!
Doing it very differently *seems* to work, but most likely I am not
understanding something.

Here is my code, contrasted with the book's code. The class
KeepSpecificElementsFilter is at the end:

--------------------------
MY TRIAL AND ERROR WAY:
---------------------------
FileReader r = new FileReader( "filename" );
XMLReader xr = XMLReaderFactory.createXMLReader();
KeepSpecificEltsFilter filter = new KeepSpecificEltsFilter( xr,
"elt");
XMLWriter xw = new XMLWriter( filter, new FileWriter( "Out.xml" ) );
xw.parse( new InputSource(r) );

--------------------------------------------------------
THE WAY THE BOOK SAYS TO DO IT (maybe I misunderstand):
---------------------------------------------------------
FileReader r = new FileReader( s );
XMLReader xr = XMLReaderFactory.createXMLReader();
XMLWriter xw = new XMLWriter( xr, new FileWriter( "jeffOut.xml" ) );
KeepSpecificEltsFilter filter = new KeepSpecificEltsFilter( xw,
"elt");

//DefaultHandler dh = new DefaultHandler();
JeffContentHandler dh = new JeffContentHandler(xr);

filter.setContentHandler( dh );
filter.parse( new InputSource(r) );
------------------------------------------------------------
Note the difference between who does the parsing
(writer or filter) and the way they are chained together.

And Last, here is the Filter class:
------------------------------------------------------------

public class KeepSpecificEltsFilter extends XMLFilterImpl {

private List elementsToKeep;

private boolean inKeptElement = false;

public KeepSpecificEltsFilter( XMLReader parent, String
elementToKeep )
{
super( parent );
elementsToKeep = new LinkedList();
elementsToKeep.add(elementToKeep);
}

//---------------------------------------------------------------------------

public KeepSpecificEltsFilter( XMLReader parent, List elementsToKeep
)
{
super(parent);
this.elementsToKeep = elementsToKeep;
}

//---------------------------------------------------------------------------

public void startElement( String uri, String localName, String qName,
Attributes atts)
throws SAXException
{
if( elementsToKeep.contains(localName) )
{
System.out.println("In kept element = " + localName);
super.startElement( uri, localName, qName, atts );
inKeptElement = true;
}
else
{
}
}

//---------------------------------------------------------------------------

public void endElement( String uri, String localName, String qName )
throws SAXException
{
if( elementsToKeep.contains(localName) )
{
super.endElement( uri, localName, qName );
inKeptElement = false;
}
else
{
// DON'T DO ANYTHING... PREVENTS PROCESSING OF
ELEMENTS
}
}

//---------------------------------------------------------------------------

public void characters( char ch[], int start, int len )
throws
SAXException
{
if( inKeptElement )
{
super.characters( ch, start, len );
}
}
}

Any insight would be appreciated!

--Jeff

 
Reply With Quote
 
 
 
 
Jeff Calico
Guest
Posts: n/a
 
      02-22-2006
I forgot to add that I don't understand what to do with the
ContentHandler class;
I tried to use the DefaultHandler, and then I tried my own class
"JeffContentHandler"
with an empty implementation. It seems to me that the Filter class is
doing this
work though, so why would I register a ContentHandler?

--Jeff

 
Reply With Quote
 
 
 
 
Joseph Kesselman
Guest
Posts: n/a
 
      02-22-2006
Jeff Calico wrote:
> I forgot to add that I don't understand what to do with the
> ContentHandler class;
> I tried to use the DefaultHandler, and then I tried my own class
> "JeffContentHandler"
> with an empty implementation. It seems to me that the Filter class is
> doing this
> work though, so why would I register a ContentHandler?


Normally, the filter is a ContentHandler whose only job is to pass
selected events along to another ContentHandler which actually uses the
filtered document. You have to register your "real" ContentHandler with
the filter so it knows what to do with the events after deciding whether
to keep them or not.

Alternatively, of course, you can combine both the filtering and the
operate-on-the-data stages in a single custom ContentHandler. But in
that case there's no need for it to claim to be a Filter.


--
Joe Kesselman / Beware the fury of a patient man. -- John Dryden
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
ContentHandler.characters( ) in SAX Armel XML 0 12-15-2008 04:39 PM
using xmlwriter to create attributes for an excel tag =?Utf-8?B?UGF1bA==?= ASP .Net 1 11-07-2006 07:03 PM
programming: SAX and get content between open and close tag? Rui Maciel XML 12 07-07-2006 03:36 PM
writing out schema attribute in xmlwriter Stu ASP .Net Web Services 0 03-30-2005 02:17 PM



Advertisments