Java SAX parser. How to get the raw XML code of the currently parsingevent

Discussion in 'XML' started by PatlaDJ, Jul 2, 2008.

  1. PatlaDJ

    PatlaDJ Guest

    Java SAX parser, please need a clue how to get the raw XML code of the
    currently parsing event... needed for logging, debugging purposes.

    Here's and example, letting me clarify exactly what i need: (see the
    comments in source)

    public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
    //..Here... or maybe somewhere elsewhere I need on my disposal the raw
    XML code of every XML tags received from the XML stream.
    //.. I need simply to write them down in a log file, for debugging
    purposes, while parsing.
    //.. Can anyone give me a suggestion how can i do that logging while
    the SAX parser only returns me the tagname and attributes. While
    parsing I want to log the XML code for every tag in its 'pure form',
    like it is comming from the server directly on the socket's input
    reader.

    if ("p".equals(qName)) {
    //Do
    something...
    }

    }
     
    PatlaDJ, Jul 2, 2008
    #1
    1. Advertising

  2. Re: Java SAX parser. How to get the raw XML code of the currentlyparsing event

    PatlaDJ wrote:
    > Java SAX parser, please need a clue how to get the raw XML code of the
    > currently parsing event... needed for logging, debugging purposes.
    >
    > Here's and example, letting me clarify exactly what i need: (see the
    > comments in source)
    >
    > public void startElement(String uri, String localName, String qName,
    > Attributes attributes) throws SAXException {
    > //..Here... or maybe somewhere elsewhere I need on my disposal the raw
    > XML code of every XML tags received from the XML stream.


    I don't think the SAX API provides access to the raw XML.

    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Jul 3, 2008
    #2
    1. Advertising

  3. PatlaDJ

    PatlaDJ Guest

    Re: Java SAX parser. How to get the raw XML code of the currentlyparsing event

    On 3 Þëè, 15:30, Martin Honnen <> wrote:
    > PatlaDJ wrote:
    > > Java SAX parser, please need a clue how to get the raw XML code of the
    > > currently parsing event... needed for logging, debugging purposes.

    >
    > > Here's and example, letting me clarify exactly what i need: (see the
    > > comments in source)

    >
    > > public void startElement(String uri, String localName, String qName,
    > > Attributes attributes) throws SAXException {
    > > //..Here... or maybe somewhere elsewhere I need on my disposal the raw
    > > XML code of every XML tags received from the XML stream.

    >
    > I don't think the SAX API provides access to the raw XML.
    >
    > --
    >
    >         Martin Honnen
    >        http://JavaScript.FAQTs.com/


    Yes... now i'm pretty sure that it doesn't provide such access. Too
    bad l;(

    Right now i'm working towards clonning my input stream. Currently i'm
    trying to clone the bufferedReader i pass as an inputsourse to the
    parser ....i can't get it done :(

    Let me explain: I read from a Socket ... the chain sequence is as
    follows:

    Socket -> InputStreamReader -> BufferedReader -> InputSource -> then
    it goes to .parse(InputSource)....of the SAX.

    What node on this chain can be cloned so I can read the data two
    times.....once for the parser, once for my debugging log.

    Am I on the right track, or maybe not ?
     
    PatlaDJ, Jul 3, 2008
    #3
  4. Re: Java SAX parser. How to get the raw XML code of the currentlyparsing event

    > Socket -> InputStreamReader -> BufferedReader -> InputSource -> then
    > it goes to .parse(InputSource)....of the SAX.
    >
    > What node on this chain can be cloned so I can read the data two
    > times.....once for the parser, once for my debugging log.


    I'd suggest dealing with it at the Java level. Find or write a "wrapper"
    reader implementation which saves a copy of the data passing through it
    off to a data structure or scratch file for rereading, or perhaps which
    writes the data direct to your log as it passes through. Plug that in
    somewhere between the InputStreamReader and the InputSource -- whether
    upstream, downstream, or in place of the BufferedReader depends on the
    details of how this tee adapter is written.
     
    Joseph J. Kesselman, Jul 3, 2008
    #4
  5. PatlaDJ

    PatlaDJ Guest

    Re: Java SAX parser. How to get the raw XML code of the currentlyparsing event

    On 3 àÌÉ, 17:34, "Joseph J. Kesselman" <>
    wrote:
    > > Socket -> InputStreamReader -> BufferedReader -> InputSource -> then
    > > it goes to .parse(InputSource)....of the SAX.

    >
    > > What node on this chain can be cloned so I can read the data two
    > > times.....once for the parser, once for my debugging log.

    >
    > I'd suggest dealing with it at the Java level. Find or write a "wrapper"
    > reader implementation which saves a copy of the data passing through it
    > off to a data structure or scratch file for rereading, or perhaps which
    > writes the data direct to your log as it passes through. Plug that in
    > somewhere between the InputStreamReader and the InputSource -- whether
    > upstream, downstream, or in place of the BufferedReader depends on the
    > details of how this tee adapter is written.


    YES!

    I've solved my problem using class RecordingInputStream that wraps the
    InputStream
    here is the class source code:

    import java.io.ByteArrayOutputStream;
    import java.io.FilterInputStream;
    import java.io.InputStream;
    import java.io.IOException;

    /**
    *
    * @author Unknown
    *
    */

    class RecordingInputStream extends FilterInputStream {
    protected ByteArrayOutputStream sink;

    RecordingInputStream(InputStream in) {
    this(in, new ByteArrayOutputStream());
    }

    RecordingInputStream(InputStream in, ByteArrayOutputStream sink)
    {
    super(in);
    this.sink = sink;
    }

    public synchronized int read() throws IOException {
    int i = in.read();
    sink.write(i);
    return i;
    }

    public synchronized int read(byte[] buf, int off, int len) throws
    IOException {
    int l = in.read(buf, off, len);
    sink.write(buf, off, l);
    return l;
    }

    public synchronized int read(byte[] buf) throws IOException {
    return read(buf, 0, buf.length);
    }

    public synchronized long skip(long len) throws IOException {
    long l = 0;
    int i = 0;
    byte[] buf = new byte[1024];
    while (l < len) {
    i = read(buf, 0, (int)Math.min((long)buf.length, len -
    l));
    if (i == -1) break;
    l += i;
    }
    return l;
    }

    byte[] getBytes() {
    return sink.toByteArray();
    }

    void resetSink() {
    sink.reset();
    }
    }
     
    PatlaDJ, Jul 3, 2008
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Bernard
    Replies:
    2
    Views:
    1,074
    Bernard
    Nov 14, 2003
  2. Per Magnus L?vold
    Replies:
    0
    Views:
    2,046
    Per Magnus L?vold
    Nov 16, 2004
  3. Royan
    Replies:
    8
    Views:
    765
    Patricia Shanahan
    Feb 15, 2008
  4. Sanjeev
    Replies:
    4
    Views:
    1,464
    Stanimir Stamenkov
    May 4, 2008
  5. Erik Wasser
    Replies:
    5
    Views:
    487
    Peter J. Holzer
    Mar 5, 2006
Loading...

Share This Page