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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
