commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rich Coco <rac...@starbak.com>
Subject Re: [Digester] basic usage problem. Help me understand the stack.
Date Mon, 26 Jul 2004 22:40:48 GMT
if you are simply trying to caoture all occurrences
of <part>, the the pattern you want is "*/part" i believe.
It will find that element at all depths.

however, if you care about *where* the <part> element occurs -
eg, if it is (recursively) embedded inside other elements that you
you also have to tuen, say, into java objects of which a collection of
Part objects is a member (and maybe this higher level object is
embedded in an even higher level object that is represented by an
xml element) - then you have a much harder problem.

I am confronting it myself, but have had to turn my attention away
from it for the next week or so. i would be delighted to hear if you
implement a truly recursive solution. i'd like to steal it!
(at least the implementation design part of it).

good lucj

- rich

Dan Tarkenton wrote:
> Hello, I've used Digester a few times in the past with much success. 
> Mostly, I've parsed XML documents and simply grabbed the attributes,
> and not the body text.  I was looking through the documentation at
> http://jakarta.apache.org/commons/digester/api/ the digester package
> specifically.  When I came across the example of parsing the web.xml
> file to grab body text.  I figured, hey, this should be easy.
> 
> I have an xml document that has several elements named Part.  I
> essentially want to parse the XML document and create a collection of
> Parts.  Simple, right?  Well, I'm embarrased to say I can't figure out
> why I only get one Part object in my resulting Hashtable when I run
> the Digester.  And I can't figure out why only the first Part element
> in my document is the one that shows up.  So I figure i'm not parsing
> recursively or something.
> 
> Here's my BOMParser class:
> 
> package com.titan.bat.parsers.ise;
> 
> import com.titan.bat.util.MessageUtil;
> import com.titan.bat.util.MessageResourcesKeys;
> import com.titan.bat.exception.BOMParserException;
> import org.apache.commons.digester.Digester;
> import org.xml.sax.SAXParseException;
> import org.xml.sax.SAXException;
> 
> import java.io.File;
> import java.io.IOException;
> import java.util.Hashtable;
> import java.util.Enumeration;
> 
> /**
>  * @author dant
>  * @version $Id$
>  */
> public class BOMParser implements MessageResourcesKeys {
> 
>     public static Hashtable getParts() {
>         return parts;
>     }
> 
>     private static Hashtable parts = new Hashtable();
>     /**
>      * TODO - Change parsing to accept String, not File
>      *
>      **/
>     public void parse(String document) throws BOMParserException {
> 
>         Digester digester = initializeParser();
>         //BOMParser resultsParser = null;
>         try {
> 
>         //resultsParser = (BOMParser)digester.parse(new StringReader(document));
>         digester.parse(new
> File("/usr/local/projects/BOMAnalysis/web/xml/psbk.xml"));
>         } catch (SAXParseException saxe) {
> 	    	String msg =
> MessageUtil.formatMessage(MSG_FULLY_INDENTED_BOM_PARSER_FAILURE);
> 	    	throw new BOMParserException(msg, saxe);
>     	} catch (SAXException saxe) {
> 	    	String msg =
> MessageUtil.formatMessage(MSG_FULLY_INDENTED_BOM_PARSER_FAILURE);
> 	    	throw new BOMParserException(msg, saxe);
>     	} catch (IOException ioe) {
> 	    	String msg = MessageUtil.formatMessage(MSG_FULLY_INDENTED_BOM_IO_FAILURE);
> 	    	throw new BOMParserException(msg, ioe);
> 
>     	}
>     }
> 
>     /**
>      * Initializes the parsing rules for the Apache Digester parser.
>      **/
>     public Digester initializeParser() {
> 
> 	    // instantiate Digester and enable XML validation
>         Digester digester = new Digester();
> 
>         digester.push(this);
>         digester.setErrorHandler(new BOMParserErrorHandler());
>         digester.setValidating(true);
> 
>         // instantiate BOMParser class
>         //digester.addObjectCreate("product", BOMParser.class );
>         digester.addObjectCreate("product/component/part",
> "com.titan.bat.parsers.ise.Part" );
> 
>         //digester.addCallMethod("product/component/quantity",
> "setQuantity", 0);
>         //digester.addCallMethod("product/component/refDesignators/refDes",
> "addRefDes", 0);
>         digester.addCallMethod("product/component/part/partNumber",
> "setPartNumber", 0);
>         digester.addCallMethod("product/component/part/partDescription",
> "setPartDescription", 0);
>         digester.addCallMethod("product/component/part/partMaterialCode",
> "setPartMaterialCode", 0);
>         digester.addCallMethod("product/component/part/partUM", "setPartUM", 0);
>         digester.addCallMethod("product/component/part/partSpecHandling/SpecCode",
> "addSpecCode", 0);
>         digester.addSetNext("product/component/part", "addPart" );
>         return digester;
>     }
> 
> 
>     public void addPart(Part part) {
>         parts.put(part.getPartNumber(), part);
>     }
> 
>     public static void main (String args[]) {
> 
>         BOMParser parser = new BOMParser();
>         parser.initializeParser();
>         try {
>             parser.parse("foo");
>         } catch (BOMParserException e) {
>             e.printStackTrace();
>         }
>         Hashtable parts = parser.getParts();
>         Enumeration x = parts.keys();
>         while (x.hasMoreElements()) {
>             String partNumber = (String)x.nextElement();
>             System.out.println("partnumber = " + partNumber);
>             Part part = (Part)parts.get(partNumber);
>             System.out.println("PartDescription = " +
> part.getPartDescription());
>             System.out.println("Part Material Code = " +
> part.getPartMaterialCode());
>             System.out.println("Part UM = " + part.getPartUM());
>         }
>     }
> }
> 
> I suppose I have configured the digester incorrectly in the
> initialize() method.
> 
> Anyone seeing the obvious that I'm not seeing?  
> 
> Thanks in advance.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-user-help@jakarta.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org


Mime
View raw message