Avatar billede carstenknudsen Nybegynder
30. marts 2004 - 12:37

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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester