Langsom xml parser
Klassen XMLBeautifyHandler bruges i en simpel editor der editerer xml filer (benytter sax parsing). Denne klasse har til formål at forskønne teksten så der indenteres, således at xml teksten er let at læse. Problemet er, at for selv mindre tekster kan det tage endog rigtig lang tid at forskønne teksten. Klassen bruge StackParsingDefaultHandler der også er inkluderet nedenfor. Er der nogen der kan pege på hvad det er der gør denne metode langsom og hvad der skal gøres for at udbedre dette.import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.ext.*;
import org.xml.sax.helpers.*;
import java.io.*;
import java.util.*;
import java.net.*;
public class XMLBeautifyHandler
extends StackParsingDefaultHandler
implements Serializable, LexicalHandler {
private static final String CR = System.getProperty( "line.separator" );
private String space = " ";
private StringBuffer output;
private int level = 0;
public XMLBeautifyHandler( XMLReader xmlreader ) {
super( xmlreader );
output = new StringBuffer( 100 * 1024 );
stack.push( output );
} // constructor
public void comment( char[] ch, int start, int length ) {
for (int i = 0; i < level; i++) {
output.append( space );
} // for
output.append( "<!--" );
output.append( ch, start, length );
output.append( "-->" + CR );
contents.reset();
}
public void skippedEntity( String name ) {}
public void startCDATA() {}
public void endCDATA() {}
public void startDTD( String name, String publicId, String systemId ){}
public void endDTD() {}
public void startEntity( String name ) {}
public void endEntity( String name ) {}
public void startElement( String nameSpaceURI,
String localName,
String qName,
Attributes attr ) throws SAXException {
String s = contents.toString();
s = s.trim();
// if there is something in the contents buffer empty it first
contents.reset();
if ( ! s.equals( "" ) ) {
for (int i = 0; i < level; i++) {
output.append( space );
} // for
output.append( s );
output.append( CR );
} // if
for (int i = 0; i < level; i++) {
output.append( space );
} // for
int length = attr.getLength();
if ( length == 0 ) {
output.append( "<" );
output.append( qName );
output.append( ">" );
output.append( CR );
} // if
else {
output.append( "<" + qName );
for (int i = 0; i < length; i++) {
String name = attr.getQName( i );
String value = attr.getValue( i );
output.append( " " );
output.append( name );
output.append( "=\"" );
output.append( value );
output.append( "\"" );
} // for
output.append( ">" );
output.append( CR );
} // else
level++;
} // startElement
public void endElement( String nameSpaceURI,
String localName,
String qName ) throws SAXException {
level--;
String s = contents.toString();
s = s.trim();
// if there was no content finish the start tag with />
if ( s.equals( "" ) ) {
for (int i = 0; i < level; i++) {
output.append( space );
} // for
output.append( "</" );
output.append( qName );
output.append( ">" );
output.append( CR );
} // if
// else finish the start tag with > and output content and end tag
else {
for (int i = 0; i <= level; i++) {
output.append( space );
} // for
output.append( s );
output.append( CR );
for (int i = 0; i < level; i++) {
output.append( space );
} // for
output.append( "</" );
output.append( qName );
output.append( ">" );
output.append( CR );
} // else
contents.reset();
} // endElement
public static void main( String[] args ) throws Exception {
XMLSource xmlsource = new XMLSource( new URL( "file:function.xml" ) );
XMLReader xr = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
XMLBeautifyHandler handler = new XMLBeautifyHandler( xr );
xr.setContentHandler( handler );
xr.parse( xmlsource.getInputSource() );
System.out.println( "stack=" + handler.getStack() );
} // main
} // XMLBeautifyHandler
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
import java.util.*;
public abstract class StackParsingDefaultHandler
extends DefaultHandler
implements CollectingHandler, Serializable {
protected XMLReader xmlreader = null;
protected ContentHandler parent = null;
protected int levelCounter = 0;
protected CharArrayWriter contents = new CharArrayWriter();
protected Stack stack = new Stack();
public StackParsingDefaultHandler( XMLReader xmlreader ) {
this.xmlreader = xmlreader;
} // constructor
public StackParsingDefaultHandler( XMLReader xmlreader, ContentHandler parent ) {
this.xmlreader = xmlreader;
this.parent = parent;
} // constructor
public void parse( XMLReader xmlreader,
Stack stack ) {
this.stack = stack;
this.levelCounter = 0;
this.xmlreader = xmlreader;
this.parent = xmlreader.getContentHandler();
this.xmlreader.setContentHandler( this );
} // parse
public Stack getStack() {
return stack;
} // getStack
public void characters( char[] ch,
int start,
int length ) {
contents.write( ch, start, length );
} // characters
public List getCollectedObjects() {
List list = new ArrayList();
list.add( stack.pop() );
return list;
} // getCollectedObjects
} // StackParsingDefaultHandler
