Xerces - SAX - ContentHandler question

hi,
I am just trying to work out how to get at variables with a registered and set ContentHandler after the parsing process.
e.g.
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
ContentHandler contentHandler = new CustomContentHandler();
reader.setContentHandler(contentHandler);If I had a method inside my customerHandler,
  public boolean getFlag(){
    return flag;
  }i would have thought this may work but does not,
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
ContentHandler contentHandler = new CustomContentHandler();
reader.setContentHandler(contentHandler);
ContentHandler handler = reader.getContentHandler();
if(handler.getFlag()){
....process
}else{
  ....do something else
}is something like this possible.
I know all logic can go in the handler, but acn this be done?
jp.

ahhh!!!
I probably would have got round to thinking to do that,
I tried CustomerContentHandler handler = (ContentHandler)reader.getContentHandler();
the reason I want to do it this way was just to keep logic native to the xml processing in the Handler, and then send a msg back to the web service client, depending on what went on in the handler, for example,
public class MyWebService{
  XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
ContentHandler contentHandler = new CustomContentHandler();
reader.setContentHandler(contentHandler);
reader.parse("my sax input source")
CustomContentHandler handler = (CustomContentHandler) reader.getContentHandler();
if(handler.getFlag()){
  build msg response
}else{
   build other msg response
return messageResponse;
}I'm not sure if I could have send the messageResponse from within the ContentHandler ?

Similar Messages

  • Another SAX Parser Question

    Hi All,
    I get an xml file by making an http request. The name of the DTD comes as a relative path in the response xml file.
    Questions
    1. Is there a way to handle this
    2. I read somewhere that i could avoid looking at the DTD alltogether,
    can someone show me how with a sample code.
    Kind regards

    Nothing seems to help, Please help,
    Im using jdk1.4 A full source codee would be great.
    Thanks in advance.
    This is the trace and the Code follows below:
    C:\codes\parser>java -classpath xerces.jar;. ReaderConnector
    Initiating Connection to System URL = http://a.b.c.com:5280/vega/
    request?method=login&ui=ch16132-user&pwd=pass
    Connected ..
    Opening Stream for reading data
    Got input stream java.io.BufferedInputStream@19821f
    Got reader java.io.BufferedReader@addbf1
    Read login file ...
    Parsing ...
    Start of Login document
    \vega\xml\xrf.dtd (The system cannot find the path)
    Parsed
    ********************************3
    *****Code*****
    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import java.io.*;
    import java.util.*;
    import java.net.*;
    import org.xml.sax.EntityResolver;
    import org.xml.sax.InputSource;
    import org.xml.sax.helpers.*;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.Locator;
    import org.xml.sax.Attributes;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLReaderFactory;
    * @author  JAVA
    * @version
    public class ReaderConnector{
        public ReaderConnector() {
        /*Login URl doesnt change*/
        private  String loginUrl  = "http://a.b.c.com:5280/vega/request?method=login&ui=ch16132-user&pwd=pass";
        //private  String loginUrl  = "c://temp/test.xml";
        private String sessionId;
        public String getSessionId(){
            if(sessionId == null){
                createConnection();
                return sessionId;
            }else{
                return sessionId;
        public void createConnection() {
            DataInputStream inputStream = null;              
            BufferedReader reader = null;
             InputStream in = null;
             FileOutputStream fos= null;
             //System.setProperty("javax.xml.parsers.SAXParserFactory",  "org.apache.xerces.jaxp.SAXParserFactoryImpl");
            try {
                URL url = new URL(loginUrl);
                URLConnection connection = url.openConnection();               
                connection.setUseCaches(false);               
                System.out.println(" Initiating Connection to System URL =  " + "http://a.b.c.com:5280/vega/request?method=login&ui=ch16132-usr&pwd=pass");
                connection.connect();
                System.out.println(" Connected ..");
                System.out.println(" Opening Stream for reading data ");
                 in = new BufferedInputStream (new DataInputStream (connection.getInputStream()));                                                               
                System.out.println("Got input stream "+ in);
                reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(in)));                               
                System.out.println("Got reader "+ reader);
                System.out.println("Read login file ...");
                parseStream(reader);
            }catch (Exception e) {
                    System.out.println(e.getMessage());               
            }finally {
                try {
                    in.close();
                        //fos.close();
                    if (inputStream != null) {
                        inputStream.close();
                    if(reader!=null){
                        reader.close();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                    ex.printStackTrace();
         public void parseStream(BufferedReader br){
            System.out.println("Parsing ...");
            try{           
                /*SAXParserFactory spf = SAXParserFactory.newInstance();
                spf.setValidating(false);
                spf.setNamespaceAware(false);
                org.xml.sax.Parser sp = (org.xml.sax.Parser)spf.newSAXParser();
                //sp.isValidating(false);
                sp.setDTDHandler(new Resolver());
                //sp.setDocumentHandler(new Handler());
                InputSource iSource = new InputSource(br);
                Handler h = new Handler();
                sp.parse(iSource );            */
              XMLReader parser;
              parser = XMLReaderFactory.createXMLReader();
              parser.setContentHandler(new Handler());
             parser.setDTDHandler(new Resolver());
              parser.parse(new InputSource(br));
            }catch(Exception e){
                System.out.println(e.getMessage());
            System.out.println("Parsed");
        public static void main(String [] args){
            ReaderConnector connector = new ReaderConnector ();
            //connector.testParsing("c://temp/test.xml");
            connector.createConnection();
        private class Resolver extends DefaultHandler{
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
          System.err.println(publicId + " ! " + systemId);
          if (("/vega/xml/xrf.dtd").equalsIgnoreCase(systemId) || ("/vega/xml/xrf.dtd").equalsIgnoreCase(publicId))
            try {
              return new InputSource(new URL("http://a.b.c.com:5280"+systemId).openStream());
            } catch (MalformedURLException e) {
              throw new SAXException(e);
            } catch (IOException e) {
              throw new SAXException(e);
          else return null;
        private class Handler extends org.xml.sax.helpers.DefaultHandler{                      
            public void startDocument() throws org.xml.sax.SAXException {
                System.out.println("Start of Login document");           
            public void endDocument() throws org.xml.sax.SAXException {           
                System.out.println("End of document");
            public void ignorableWhitespace(char[] values, int param, int param2) throws org.xml.sax.SAXException {
            public void endElement(java.lang.String str, java.lang.String str1, java.lang.String str2) throws org.xml.sax.SAXException {
                System.out.println("End of element reached: str, str1, str2 "+ str + " , "+ str1 + " , "+ str2);
                System.out.println("Session ID "+ sessionId);
            public void skippedEntity(java.lang.String str) throws org.xml.sax.SAXException {           
            public void processingInstruction(java.lang.String str, java.lang.String str1) throws org.xml.sax.SAXException {           
            public void startElement(java.lang.String str, java.lang.String str1, java.lang.String str2, org.xml.sax.Attributes attributes) throws org.xml.sax.SAXException {                            
                if(("A").equals(str2)){
                    for(int i=0; i< attributes.getLength();i++){
                        System.out.println("Attribute "+ i + ", Name, Value "+ attributes.getQName(i) + ", " + attributes.getValue(i));
                        if(("v").equalsIgnoreCase(attributes.getQName(i)))
                            sessionId = attributes.getValue(i);
            public void endPrefixMapping(java.lang.String str) throws org.xml.sax.SAXException {
            public void startPrefixMapping(java.lang.String str, java.lang.String str1) throws org.xml.sax.SAXException {
            public void characters(char[] values, int param, int param2) throws org.xml.sax.SAXException {           
                String s =  new String(values);
                String text = s.substring(param, param+param2);                       
            public void setDocumentLocator(org.xml.sax.Locator locator) {
    XML File
      <?xml version="1.0" encoding="ISO-8859-1" ?>
      <!DOCTYPE XRF (View Source for full doctype...)>
    - <XRF r="2.11.1" c="" g="" u="ch16132-user" k="" d="20050614" t="151146">
      <A k="i0005" n="3" v="1964216949" />
      </XRF>
    ****When you view source*******
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE XRF SYSTEM "/vega/xml/xrf.dtd">
    <XRF r="2.11.1" c="" g="" u="ch16132-user" k="" d="20050614" t="151722">
    <A k="i0005" n="3" v="350287547"/>
    </XRF>

  • Get document url in SAX ContentHandler

    Hopefully a simple question, but how to get the name or URL of the current document handled by a SAX ContentHandler? I don't see this in the startDocument or startElement callbacks.

    nm found out about setDocumentLocator

  • Xerces SAX parser don`t initialize a characters array

    Xerces SAX parser don`t initialize a characters array from characters() method in DefaultHandler.
    I use jdk 1.5.12.
    For value "22-11-2009" variables start=1991, length=9.
    Result: "22-11-200"

    My handler:
    package com.epam.xmltask.parsers;
    import com.epam.xmltask.model.Category;
    import com.epam.xmltask.model.Goods;
    import com.epam.xmltask.model.Products;
    import com.epam.xmltask.model.Subcategory;
    import com.epam.xmltask.utils.Constants;
    import com.epam.xmltask.utils.DateConverter;
    import java.text.ParseException;
    import java.util.Date;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.ErrorHandler;
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
    import org.xml.sax.helpers.DefaultHandler;
    public class SAXProductsParser extends DefaultHandler implements IProductsParser {
        private Logger logger = null;
        private SAXParser parser = null;
        private ErrorHandler errorHandler = null;
        private Products products = null;
        private Category category = null;
        private Subcategory subcategory = null;
        private Goods goods = null;
        private String currentField = Constants.EMPTY_STRING;
        protected Logger getLogger() {
            if (logger == null) {
                logger = Logger.getLogger(SAXProductsParser.class.getName());
            return logger;
        protected SAXParser getParser() throws Exception {
            if (parser == null) {
                try {
                    SAXParserFactory parserFactory = SAXParserFactory.newInstance();
                    parserFactory.setNamespaceAware(true);
                    parserFactory.setValidating(true);
                    parser = parserFactory.newSAXParser();
                    parser.setProperty(Constants.SCHEMA_LANGUAGE, Constants.XML_SCHEMA);
                } catch (Exception ex) {
                    getLogger().log(Level.SEVERE, null, ex);
                    throw ex;
            return parser;
        public ErrorHandler getErrorHandler() {
            if (errorHandler == null) {
                errorHandler = new ProductsErrorHandler();
            return errorHandler;
        public Products getProducts(String uri) throws Exception {
            try {
                products = new Products();
                getParser().parse(uri, this);
                return products;
            } catch (Exception ex) {
                getLogger().log(Level.SEVERE, null, ex);
                throw ex;
        @Override
        public void startElement(String uri, String localName,
                String qName, Attributes attributes) {
            if (Constants.CATEGORY.equals(qName)) {
                String name = attributes.getValue(Constants.NAME);
                category = new Category(name);
            } else if (Constants.SUBCATEGORY.equals(qName)) {
                String name = attributes.getValue(Constants.NAME);
                subcategory = new Subcategory(name);
            } else if (Constants.GOODS.equals(qName)) {
                String name = attributes.getValue(Constants.NAME);
                goods = new Goods(name);
            } else if (Constants.NOT_IN_STOCK.equals(qName)) {
                goods.setIsInStock(false);
            } else {
                currentField = qName;
        @Override
        public void endElement(String uri, String localName, String qName) {
            if (Constants.CATEGORY.equals(qName)) {
                products.addCategory(category);
                category = null;
            } else if (Constants.SUBCATEGORY.equals(qName)) {
                category.addSubcategory(subcategory);
                subcategory = null;
            } else if (Constants.GOODS.equals(qName)) {
                subcategory.addGoods(goods);
                goods = null;
            } else {
                currentField = Constants.EMPTY_STRING;
        @Override
        public void characters(char[] chars, int start, int length) throws SAXException {
            String field = new String(chars, start, length).trim();
            if (goods != null) {
                if (Constants.PRODUSER.equals(currentField)) {
                    goods.setProducer(field);
                } else if (Constants.MODEL.equals(currentField)) {
                    goods.setModel(field);
                } else if (Constants.DATE_OF_ISSUE.equals(currentField)) {
                    Date date = null;
                    try {
                        date = DateConverter.getConvertedDate(field);
                    } catch (ParseException ex) {
                        getLogger().log(Level.SEVERE, null, ex);
                        throw new SAXException(ex);
                    goods.setDateOfIssue(date);
                } else if (Constants.COLOR.equals(currentField)) {
                    goods.setColor(field);
                } else if (Constants.PRICE.equals(currentField)) {
                    Float price = Float.valueOf(field);
                    goods.setPrice(price);
        @Override
        public void error(SAXParseException ex) throws SAXException {
            getErrorHandler().error(ex);
        @Override
        public void fatalError(SAXParseException ex) throws SAXException {
            getErrorHandler().fatalError(ex);
        @Override
        public void warning(SAXParseException ex) throws SAXException {
            getErrorHandler().warning(ex);
    }

  • SAX-ContentHandler -characters methods gets wrong int end sometimes

    Hi
    I am having problems with SAX-ContentHandler -characters methods. It gets wrong int end values time to time ---means that it chops up my strings when it reads large XML files.
    Is there any way to correct it? Any suggestions will be very helpful. Thank you.
    My code is below.
    public class MyContentHandlerDemo extends Thread implements ContentHandler{
    private ArrayList hitList = new ArrayList(1000);
    private ArrayList hitId = new ArrayList(1000);
    private ArrayList hspNum = new ArrayList(1000);
    private ArrayList hitLength = new ArrayList(1000);
    private ArrayList queryFrom = new ArrayList(1000);
    private ArrayList hspith = new ArrayList(1000);
    private ArrayList idith = new ArrayList(1000);
    private String localname;
    private Locator locator;
    private int know=1;
    private int knowid=1;
    private int knowlength=1;
    private int knowhitlength=1;
    private int knowhspnum=1;
    private int knowhspnumadd=1;
    private int knowhspnumlength=1;
    private int knowquery=1;
    private int knowqueryfrom=1;
    private int processon =1;
    private int processcount = 0;
    private int hspithnum=0;
    private int idithnum=0;
    String allstr;
    String addseq;
    char [] allchar;
    int icount=0;
    int lengthsum=0;
    public synchronized void setDocumentLocator(Locator locator) {
    System.out.println(" * setDocumentLocator() called");
    // We save this for later use if desired.
    this.locator = locator;
    public synchronized void startDocument() throws SAXException {
    System.out.println("Parsing begins...");
    public synchronized void endDocument() throws SAXException {
    try {
    FileOutputStream outputfileDemo;
    PrintStream printoutDemo;
    outputfileDemo= new FileOutputStream("apoe500.fasta");
    printoutDemo=new PrintStream(outputfileDemo);
    FileOutputStream reSaxfile;
    PrintStream printoutReSax;
    reSaxfile= new FileOutputStream("reSax.txt");
    printoutReSax=new PrintStream(reSaxfile);
    int m = hitList.size();
    for (int k=0; k < m; k++) {
    int comp = (((hitList.get(k)).toString()).length());
    String strComp = Integer.toString(comp);
    String hitleng = (hitLength.get(k)).toString();
    if(strComp.compareTo(hitleng)!=0)
    {System.out.println("Warning: Length is different at hit number (-1) " + hitId.get(k));}
    for (int l=0; l < hspith.size(); l++){
    printoutReSax.println((hspith.get(l)).toString());
    outputfileDemo.close();
    printoutDemo.close();
    reSaxfile.close();
    printoutReSax.close();
    } catch (IOException e) {
    System.out.println("IOException errors");
    System.out.println("...Parsing ends.");
    public synchronized void processingInstruction(String target, String data)
    throws SAXException {
    //System.out.println("PI: Target:" + target + " and Data:" + data);
    public synchronized void startPrefixMapping(String prefix, String uri) {
    //System.out.println("Mapping starts for prefix " + prefix +
    // " mapped to URI " + uri);
    public synchronized void endPrefixMapping(String prefix) {
    //System.out.println("Mapping ends for prefix " + prefix);
    public synchronized void startElement(String namespaceURI, String localName,
    String rawName, Attributes atts)
    throws SAXException {
    localname =localName;
    int which =100;
    if (localname.equals("Hit_id")) {which = 0;}
    if (localname.equals("Hsp_num")) {which = 1;}
    if (localname.equals("Hsp_hseq")) {which = 2;}
    if (localname.equals("Hsp_align-len")) {which =3;}
    if (localname.equals("Hsp_query-from")) {which =4;}
    switch (which){
    case 0: knowid=0;
    //icount=icount+1;
    break;
    case 1: knowhspnum=0;icount=icount+1;
    break;
    case 2: know=0; //icount=icount+1;
    break;
    case 3: knowlength=0; //icount=icount+1;
    break;
    case 4: knowquery=0; //icount=icount+1;
    break;
    default: knowid=1; know=1; knowlength=1; knowhspnum=1;knowhitlength=1;knowquery=1;
    public synchronized void endElement(String namespaceURI, String localName,
    String rawName)
    throws SAXException {
    //System.out.println("endElement: " + localName + "\n");
    public synchronized void characters(char[] ch, int start, int end)
    throws SAXException {
    String s = new String(ch, start, end);
    int process=100;
    if (knowid==0) {process=0;}
    if (knowhspnum==0){process=1;}
    if (know==0) {process=2;}
    if (knowlength==0) {process=3;}
    if(knowquery==0){process=4;}
    switch(process){
    case 0:
    idithnum = idithnum+1;
    //int start1 = start;
    //int end1 = end;
    //char [] datahold1 = new char[end1];
    //for (int i=0;i<end1;i++){
    //datahold1=ch[start1+i];
    //warn if the length is differernt
    int n=s.length();
    allchar = new char[n+1];
    allchar[0] = '>';
    for (int i=0; i<n; i++){
    allchar[i+1]=s.charAt(i);
    allstr = new String(allchar);
    hitId.add(allstr);
    knowid=1;
    processon=1;
    break;
    case 1:
    hspNum.add(s);
    if ((s.compareTo(Integer.toString(1)))!=0){
    String hspallstr = new String (allstr.concat(s));
    hitId.add(hspallstr);
    knowhspnum=1;
    processon=1;
    break;
    case 2:
    hitList.add(s);
    know=1;
    processon=1;
    break;
    case 3:
    hitLength.add(s);
    knowlength=1;
    processon=1;
    break;
    case 4:
    queryFrom.add(s);
    knowquery=1;
    processon=1;
    break;
    default: processon=0;
    public synchronized void ignorableWhitespace(char[] ch, int start, int end)
    throws SAXException {
    String s = new String(ch, start, end);
    public synchronized void skippedEntity(String name) throws SAXException {

    I put some more codes in characters(). Then I got OutOfMemory: Java Heap Error.
    I probably have to write something in startElement() to limit input for characters() method.
    Could anyone help me? I need to limit inputs for charactes() in startElement().
    I added some codes in characters() method
    public synchronized void characters(char[] ch, int start, int end)
            throws SAXException {
            String s;
            StringBuffer stringbuf1;
            String finalstring1;
            int process=100;
            if (knowid==0) {process=0;}
            if (knowhspnum==0){process=1;}
            if (know==0) {process=2;}
            if (knowlength==0) {process=3;}
            if(knowquery==0){process=4;}
            switch(process){
            case 0:
            //s = new String(ch, start, end);
            idithnum = idithnum+1;
            //int start1 = start;
            //int end1 = end;
            //char [] datahold1 = new char[end1];
            stringbuf1 = new StringBuffer();
            while(ch!=null){
            stringbuf1.append(ch);   
            finalstring1 = stringbuf1.toString();
            //warn if the length is differernt
            int n=finalstring1.length();
            allchar = new char[n+1];
            allchar[0] = '>';
            for (int i=0; i<n; i++){
            allchar[i+1]=finalstring1.charAt(i);
            allstr = new String(allchar);
            hitId.add(allstr);
            knowid=1;
            processon=1;
            break;
            case 1:
            //s = new String(ch, start, end);
            stringbuf1 = new StringBuffer();
            while(ch!=null){
            stringbuf1.append(ch);   
            finalstring1 = stringbuf1.toString();
            hspNum.add(finalstring1);
            if ((finalstring1.compareTo(Integer.toString(1)))!=0){
            String hspallstr = new String (allstr.concat(finalstring1));
            hitId.add(hspallstr);
            //System.out.println(allstr);
            knowhspnum=1;
            processon=1;
            break;
            case 2:
            //s = new String(ch, start, end);
            //int lengthend=end;
            stringbuf1 = new StringBuffer();
            while(ch!=null){
            stringbuf1.append(ch);   
            finalstring1 = stringbuf1.toString();
            checklength:
            while(know==0){
            if(lengthend!=new Integer((hitLength.get(hitLength.size()-1)).toString())){
            String s1=new String(ch, start, end);
            s = (((hitList.get((hitList.size())-1)).toString()).concat(s1));
            hitList.add(s);know=1;
            break;
            hitList.add(finalstring1);
            processon=1;
            break;
            case 3:
            //s = new String(ch, start, end);
            stringbuf1 = new StringBuffer();
            while(ch!=null){
            stringbuf1.append(ch);   
            finalstring1 = stringbuf1.toString();
            hitLength.add(finalstring1);
            knowlength=1;
            processon=1;
            break;
            case 4:
            //s = new String(ch, start, end);
            stringbuf1 = new StringBuffer();
            while(ch!=null){
            stringbuf1.append(ch);   
            finalstring1 = stringbuf1.toString();
            queryFrom.add(finalstring1);
            knowquery=1;
            processon=1;
            break;
            default: processon=0;

  • Interesting SAX Parser Question

    I am running a BEA Sample weblogic server and trying to parse in XML using SAX.The endElement in the sample program to parse the XML takes only one parameter like follows
    public void endElement(String name) throws SAXException {
    its not taking the local name.. in that case what should i do .. i won;t get the local name
    I tried to change it to as follows
    public void endElement(String namespaceURI, String localName,
    String name)throws SAXException
    and printing the localName.. its always empty.
    The sample code extends like this..
    public class RequestHandler extends DefaultHandler {
    Will it make any difference ? If i extend from ContentHandler will it solve the problem ? .. Please help me
    Thanks,
    -Raj..

    Thanks sir and figured that out earlier itself..
    My question now is why i am not getting the "localName" in startElement & endElement function when i extend my class using DefaultHandler ?
    I know if the Namespace is false or not present i won't get the localName.
    But my XML has namespace .. and i get the "localName" when i extend the class using ContentHandler .. at the same time when i extend my class using DefaultHandler i am not getting the "localName" .. Do i need to explicity perform the Namespace processing ??
    I am confused why i am getting localName when i extend from ContentHandler & not when i extend it from DefaultHandler ?
    class MyHandler extends DefaultHandler {
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    // localName is always empty here
    public void endElement(String uri, String localName, String qName) throws SAXException {
    // localName is always empty here
    class MyHandler extends ContentHandler {
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    //localName has Expected Value
    public void endElement(String uri, String localName, String qName) throws SAXException {
    //localName has Expected Value
    This is the XML i have :
    <?xml version="1.0" encoding="UTF-8"?>
    <SubscriberNotification xmlns:cng="http://cs.com/CSI/Namespaces/Types/Public/DataModel.xsd"
    xmlns="http://cs.com/Namespces/Container/JMS/SubscriberNotification.xsd"
    xmlns:sn="http://cs.com/Namespaces/Container/Public/SubscriberNotification.xsd"
    xmlns:mh="http://cs.com/Namespaces/Container/Public/MessageHeader.xsd">
    <mh:TrackingMessageHeader>
    <cng:version>v3</cng:version>
    </mh:TrackingMessageHeader>
    <sn:SubscriberNotification>
    <sn:DateTime>2003-12-10T11:17:27.377Z</sn:DateTime>
    <sn:Subscriber>
    <sn:subscriberNumber>1234567890</sn:subscriberNumber>
    </sn:Subscriber>
    </sn:SubscriberNotification>
    </SubscriberNotification>

  • XERCES SAX BUG

    Hi there,
    I have been having a problem with the latest version of XERCES (2.7.1).
    Whenever I try to read a certain XML document using the SAX parser, it returns less text content for one of the elements than it should.
    The element is called <NAME> and the content for this element starts 2105 characters into the document.
    Can anybody help?
    Cian

    What is missing? Do you see the first part of the text for this <NAME> element, or the last part?
    How are you consolidating the text information? Are you aware that SAX may call the characters() method multiple times even if there is only one text block?
    You need to collect the results (perhaps using a StringBuffer) until you get to the endElement() method call.
    Is this your problem?
    Dave Patterson

  • Jaxp underlying sax class question

    Below is a class that uses the JAXP layer and parses a xml document. All works fine and my results are proper. I would like to use the JAXP abstraction in some code at work, but I am not sure of two things.
    1) What underlying parser does this use.? I believe the answser has to do with where the class was downloaded? Crimson from sun, Xerces from Apache. But I am writing code that will go to a remote server.
    2) So if the above is true, how can I through code find out what underlying parser it is using, and can I override it somehow on this remote server?
    Thanks,
    Scott
    from java and xml oreilly
    package javaxml2;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    // JAXP
    import javax.xml.parsers.FactoryConfigurationError;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParserFactory;
    import javax.xml.parsers.SAXParser;
    // SAX
    import org.xml.sax.AttributeList;
    import org.xml.sax.HandlerBase;
    import org.xml.sax.SAXException;
    * <p>
    * <code>TestSAXParsing</code> is a simple class that demonstrates
    * how JAXP can be used to work with SAX (the Simple API for XML).
    * </p>
    public class TestSAXParsing {
    * <p>Provide a static entry point.</p>
    public static void main(String[] args) {
    try {
    if (args.length != 1) {
    System.err.println ("Usage: java TestSAXParsing [filename]");
    System.exit (1);
    // Get SAX Parser Factory
    SAXParserFactory factory = SAXParserFactory.newInstance();
    // Turn on validation, and turn off namespaces
    factory.setValidating(true);
    factory.setNamespaceAware(false);
    SAXParser parser = factory.newSAXParser();
    parser.parse(new File(args[0]), new MyHandler());
    } catch (ParserConfigurationException e) {
    System.out.println("The underlying parser does not support the requested features.");
    } catch (FactoryConfigurationError e) {
    System.out.println("Error occurred obtaining SAX Parser Factory.");
    } catch (Exception e) {
    e.printStackTrace();
    class MyHandler extends HandlerBase {
    private Writer out;
    public MyHandler() throws SAXException {
    try {
    out = new OutputStreamWriter(System.out, "UTF8");
    } catch (IOException e) {
    throw new SAXException("Error getting output handle.", e);
    public void startDocument() throws SAXException {
    print("<?xml version=\"1.0\"?>\n");
    public void startElement(String elementName, AttributeList atts)
    throws SAXException {
    print("<" + elementName);
    if (atts != null) {
    for (int i=0, len = atts.getLength(); i<len; i++) {
    print(" " + atts.getName(i) +
    "=\"" + atts.getValue(i) + "\"");
    print(">");
    public void endElement(String elementName) throws SAXException {
    print("</" + elementName + ">\n");
    public void characters(char[] ch, int start, int len) throws SAXException {
    print(new String(ch, start, len));
    private void print(String s) throws SAXException {
    try {
    out.write(s);
    out.flush();
    } catch (IOException e) {
    throw new SAXException("IO Error Occurred.", e);

    I see that there are a number of code snippets on that page, for clarity I meant this one in particular. It checks for just about every parser known before calling default. Sorry for confusion. You wouldn't have to check for this many parsers, but I sometimes take Xerces if it is there over the default.
      XMLReader parser;
      try { // Xerces
        parser = XMLReaderFactory.createXMLReader(
         "org.apache.xerces.parsers.SAXParser"
      catch (SAXException e1) {
        try { // Crimson
          parser = XMLReaderFactory.createXMLReader(
           "org.apache.crimson.parser.XMLReaderImpl"
        catch (SAXException e2) {
          try { // ?lfred
            parser = XMLReaderFactory.createXMLReader(
             "gnu.xml.aelfred2.XmlReader"
          catch (SAXException e3) {
            try { // Piccolo
              parser = XMLReaderFactory.createXMLReader(
                "com.bluecast.xml.Piccolo"
            catch (SAXException e4) {
              try { // Oracle
                parser = XMLReaderFactory.createXMLReader(
                  "oracle.xml.parser.v2.SAXParser"
              catch (SAXException e5) {
                try { // default
                  parser = XMLReaderFactory.createXMLReader();
                catch (SAXException e6) {
                  throw new NoClassDefFoundError(
                    "No SAX parser is available");
                    // or whatever exception your method is 
                    // declared to throw
      }

  • XML - SAX Parsing Question

    Hi,
    I am parsing XML using SAX parser and fill the values into the HashTable ( like Key value pair ).. so i can get the vaues for a particular key using hash get function.
    For the following XML. There are 2 "subscriberNumber" attribute, one is under "sn:Subscriber" and the another is under "sn:SubscriberChange".
    I can able to put this values in hash table and when i print the Hash table it is printing as sn:subscriberNumber=[1234567890, 1234567890] .. But how will i know which one is from "sn:Subscriber" and which is from "sn:SubscriberChange"
    This is the XML :
    <sn:SubscriberNotification>
    <sn:notificationSubType>1120</sn:notificationSubType>
    <sn:Subscriber>
         <cng:PaymentType>PostPaid</cng:PaymentType>
         <sn:subscriberNumber>1234567890</sn:subscriberNumber>
    </sn:Subscriber>
    <sn:SubscriberChange>
         <sn:subscriberNumber>1234567890</sn:subscriberNumber>
    </sn:SubscriberChange>
    </sn:SubscriberNotification>
    Any suggestion and pointers are really helpful
    Thanks,
    -Raj..

    Try something like this:
    import java.util.Stack;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    class MyHandler extends DefaultHandler {
        Stack openTags = new Stack();
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.equals("sn:subscriberNumber")) {
                String parentTag = (String)openTags.peek();
                System.out.println("Parent tag of this <sn:subscriberNumber> is : <" + parentTag + ">");
            openTags.push(qName);
        public void endElement(String uri, String localName, String qName) throws SAXException {
            openTags.pop();
    }Regards

  • SAX Parsing Question

    During SAX Validation, is there a way to create custom error messages that get put in the SAXParseExceptions?
    I don't want to re-implement Schema Validation. Is there a call back method I can impement and register that gets called when a SAXParseException gets generated so that I can stuff my own message in there?

    You can create a customised SAX error handler by using the ErrorHandler interface and then providing your own implementations for the standard error(), warning(), and fatalError() methods. Then, just register this error handler with your main SAX processing program.
    For example:
    import org.xml.sax.ErrorHandler;
    import org.xml.sax.SAXParseException;
    import org.xml.sax.SAXException;
    public class ErrorChecker implements ErrorHandler {
         public ErrorChecker() {
         public void error (SAXParseException e) {
              System.err.println("[Error] " +
                           getLocationString(e) + ": " +
                           e.getMessage());
         public void warning (SAXParseException e) {
              System.err.println("[Warning] " +
                                     getLocationString(e) + ": " +
                                     e.getMessage());
         public void fatalError (SAXParseException e) throws SAXException {
              System.err.println("[Fatal Error] " +
                           getLocationString(e) + ": " +
                           e.getMessage());
              throw e;
         private String getLocationString(SAXParseException e) {
              StringBuffer str = new StringBuffer();
              String systemId = e.getSystemId();
              if (systemId != null) {
                   int index = systemId.lastIndexOf('/');
                   if (index != -1)
                        systemId = systemId.substring(index + 1);
                   str.append(systemId);
              str.append(':');
              str.append(e.getLineNumber());
              str.append(':');
              str.append(e.getColumnNumber());
              return str.toString();
    }

  • Xerces Sax not parsing a Unicode char

    My SaxParser (xerces) is failing when parsing, complaining about Unicode: 0x1d.
    I am reading from a file (InputSource), and have set the encoding to UTF-8.
    Is there any way to not parse data in specified xml elements? Without explicitly escaping the illegal character....
    Thanks,
    Karen

    Having performed some research, I discovered that this is a control character and while it is an acceptable Unicode character, it is not a valid UTF-8 character.
    Control characters are in the range U+0000....U+001F, and most of them are written out as '?'. 0x1d(Group Separator), however, is not escaped and therefore Xerces cannot parse it.
    I have written a util class that escapes control chars in Unicode.
    Thanks.

  • Java sax parsing question

    Hi All,
    Any help is appreciated. Is it possible to start parsing an XML document somewhere in the middle of the document using SAX parser? It will still parse the doc sequentially but has to start at a specified location or sorts instead of starting from the beginning.
    Thanks in advance.

    Sure. Open an InputStream on the document (a FileInputStream or whatever is convenient). Read the part of the InputStream before the document and ignore the data. When you have the InputStream's cursor pointing at the beginning of the document, pass it to the parser.

  • User defined SAX ContentHandler

    Hi All,
    Needed a few thoughts from you folks on this proposal.
    W3C defines specific methods witihn a SA ContentHandler like
    startElement(), endElement() etc... that would be called back when
    elements are encountered within the XML Document.
    User overrides these methods to define the logic within each of these
    callback methods.
    As an alternative, what if the User defines explicit methods like
    public void startEmployee() [simplified here- ignoting namespace mappings]
    public void endEmployee()
    public void onEmptyAdddress()
    public void onAttr_Employee_Name() [this is just illustrative of the
    attributes scenario.]
    Advantage
    Cleaner separation of logic.
    <<add here>>
    Disadvantages
    No Clear contract.
    <<add here>>
    This is only an ilustrative subset of the functionalty.
    What do you folks think of this ? Is this a better alternative ?
    rgds,
    Menon

    No. At least, not if you are suggesting that the parser should use reflection on your ContentHandler class and use the element name to determine what method to call. For one thing, XML element names can contain characters that are not valid in Java method names.
    But if you thought it was a good idea, you could certainly write a ContentHandler that implemented some version of that. There are places for such things -- SourceForge for one. It's quite possible that other people might find it useful too.

  • Thread/SAX parser question

    I have a program that parses an XML document using a SAX parser. It reads the XML files that are in a given directory /home/user/input. So if there are three files it will parse the files in order, one at a time. I want it to process multiple files at the same time.
    Current it�s
    Public class ProcessFile extends DefaultHandler
    How could I use Thread since I�m extending DefualtHandler for the parser?

    SAX should mask the fact that some content is specified inside of a CDATA section.. It is just characters.
    The safest way to process characters is to setup a StringBuffer or equivalent in the startElement method. There is a variation of the StringBuffer append method that has the same three parameters (char[], int, int) as the characters signature. The characters method may be called many times before you are given all of the content of the string. How it decides when to call you depends on the parser and is subject to change over time. But, if you accumulate the contents in each call of characters and do the toString() in the endElement method you are going to get the right content. Lots of people over the last year or so that I've been involved in this forum have had other ways they thought were better than this, but most of them have eventually tried and accepted this way because it works and their "better" way did not.
    It looks like you got the content for the CDATA section (Please refer...).I'm not sure what your problem is.
    Dave Patterson

  • Question About Xerces Parser and Java  JAXP

    Hi,
    I have confusion about both of these API Xerces Parser and Java JAXP ,
    Please tell me both are used for same purpose like parsing xml document and one is by Apache and one is by sun ?
    And both can parse in SAX, or DOM model ?
    Is there any difference in performane if i use xerces in my program rather then JAXP, or is ther any other glance at all.
    Please suggest some thing i have and xml document and i want to parse it.
    Thanks

    Hi
    Xerces is Apaches implementation of W3C Dom specifiacation.
    JAXP is a API for XML parsing its not implementation.
    Sun ships a default implementation for JAXP.
    you have factory methods for selecting a parser at run time or you can set in some config file about what is the implementaion class for the SAXParser is to be chosen (typically you give give the class file of xerces sax parser or dom parser etc..)
    go to IBM Developerworks site and serch for Xerces parser config. which have a good explination of how to do it.
    and browse through j2ee api .may find how to do it.

Maybe you are looking for