Search code examples
javaxmlapache-commons-digester

Locating Specific Attributes in Digester - Java


I'm using the Apache Commons Digester and trying to locate a particular tag in the structure to include in the object.

<parent>

<image size="small">some url</image>

<image size="medium">some url</image>

<image size="large">some url</image>

<image size="huge">some url</image>

</parent>

I really only want the medium image to be included in my partent object but I'm not sure how I would do that.

Right now I'm using digester.addBeanPropertySetter(PathToParent+"/image","image"); but this gets updated for every image tag (as it should).

Ideally I would like something like digester.addBeanPropertySetter(PathToParent+"/image/medium","image"); but you can't do that.


Solution

  • I omitted generic getters/setters.

      public class Parent {
    
        private Image image;
    
        public void setImage(Image image) {
          if ("medium".equals(image.getSize())) {
            this.image = image;
          }
        }
    
      }
    
      public class Image {
    
        private String size;
        private String url;
      }
    
      public static void main(String[] args) throws IOException, SAXException {
        String s = "<parent>" 
            + "<image size='small'>some url1</image>"
            + "<image size='medium'>some url2</image>"
            + "<image size='large'>some url3</image>"
            + "<image size='huge'>some url4</image>"
            + "</parent>";
    
        Digester digester = new Digester();
    
        digester.addObjectCreate("parent", Parent.class);
        digester.addFactoryCreate("parent/image", new ImageCreationFactory());
        digester.addBeanPropertySetter("parent/image", "url");
        digester.addSetNext("parent/image", "setImage");
        Parent p = (Parent) digester.parse(new StringReader(s));
      }
    
      public class ImageCreationFactory implements ObjectCreationFactory {
    
        public Object createObject(Attributes attributes) throws Exception {
          Image i = new Image();
          i.setSize(attributes.getValue("size"));
          return i;
        }
    
      }