2010-12-05 39 views
2

我正在使用Apache Commons Digester并尝试在结构中找到要包含在对象中的特定标记。在Digester中查找特定属性 - Java

<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>

我真的只想要medium图像被包含在我的partent对象中,但我不知道该怎么做。

现在我正在使用digester.addBeanPropertySetter(PathToParent+"/image","image");,但每更换一个image标签(因为它应该)。

理想情况下,我希望像digester.addBeanPropertySetter(PathToParent+"/image/medium","image");这样的东西,但你不能这样做。

回答

2

我省略了通用的getter/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; 
    } 

    } 
+0

感谢Liviu的想法。我结束了阅读属性值以及bean属性。如果大小设置为'medium',则会设置一个布尔值,以覆盖我的图像字符串值。 – smith324 2010-12-06 01:08:00

0

我不认为这是可能的。你必须编写自己的代码来执行这种过滤。

但它很简单。如果您希望使用方法getImage(String size)创建名为ImageAccessor的干净代码编写类。该方法将从沼气池获取数据并将其与预定义的大小字符串(或模式)进行比较。

+0

我还是我如何能在同一时间访问这两个属性和标签之间的数据还不清楚。所以当URL在ImageAccessor类中被设置时,它如何知道它是多大? – smith324 2010-12-05 17:20:34

1

我实际使用xmlpullparser想通了这一点 - 这里是代码,仅保留图像属性“大”,而忽略其余的 - 这是最后一个“如果”的case语句。

公共类XmlPullFeedParser扩展BaseFeedParser {

public XmlPullFeedParser(String feedUrl) { 
    super(feedUrl); 
} 

public ArrayList<Message> parse() { 
    ArrayList<Message> messages = null; 
    XmlPullParser parser = Xml.newPullParser(); 
    try { 
     // auto-detect the encoding from the stream 
     parser.setInput(this.getInputStream(), null); 
     int eventType = parser.getEventType(); 
     Message currentMessage = null; 
     boolean done = false; 
     while (eventType != XmlPullParser.END_DOCUMENT && !done){ 
      String name = null; 
      String attrib = null; 
      switch (eventType){ 
       case XmlPullParser.START_DOCUMENT: 
        messages = new ArrayList<Message>(); 
        break; 
       case XmlPullParser.START_TAG: 
        name = parser.getName(); 
        attrib = parser.getAttributeValue(0); 
        if (name.equalsIgnoreCase(EVENT)){ 
         currentMessage = new Message(); 
        } else if (currentMessage != null){ 
         if (name.equalsIgnoreCase(WEBSITE)){ 
          currentMessage.setWebsite(parser.nextText()); 
         } else if (name.equalsIgnoreCase(DESCRIPTION)){ 
          currentMessage.setDescription(parser.nextText()); 
         } else if (name.equalsIgnoreCase(START_DATE)){ 
          currentMessage.setDate(parser.nextText()); 
         } else if (name.equalsIgnoreCase(TITLE)){ 
          currentMessage.setTitle(parser.nextText()); 
         } else if (name.equalsIgnoreCase(HEADLINER)){ 
          currentMessage.setHeadliner(parser.nextText()); 
         } else if ((name.equalsIgnoreCase(IMAGE)) && (attrib.equalsIgnoreCase("large"))) { 
          currentMessage.setImage(parser.nextText()); 
         } 
        } 
        break; 
       case XmlPullParser.END_TAG: 
        name = parser.getName(); 
        if (name.equalsIgnoreCase(EVENT) && currentMessage != null){ 
         messages.add(currentMessage); 
        } else if (name.equalsIgnoreCase(EVENTS)){ 
         done = true; 
        } 
        break; 
      } 
      eventType = parser.next(); 
     } 
    } catch (Exception e) { 
     Log.e("AndroidNews::PullFeedParser", e.getMessage(), e); 
     throw new RuntimeException(e); 
    } 
    return messages; 
} 

}