【问题标题】:Locating Specific Attributes in Digester - Java在 Digester 中定位特定属性 - Java
【发布时间】:2010-12-05 07:26:10
【问题描述】:

我正在使用 Apache Commons Digester 并尝试在结构中定位特定标记以包含在对象中。

<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"); 这样的东西,但你不能这样做。

【问题讨论】:

    标签: java xml apache-commons-digester


    【解决方案1】:

    我省略了通用的 getter/setter。

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

    【讨论】:

    • 感谢 Liviu 的想法。我最终只读取了属性值以及 bean 属性。如果大小设置为“中等”,则设置一个布尔值,以启用覆盖我的图像字符串值。
    【解决方案2】:

    我实际上是使用 xmlpullparser 来解决这个问题的——这里是只获取图像属性“大”而忽略其余部分的代码——它是 case 语句中的最后一个“if”。

    公共类 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;
    }
    

    }

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我仍然不清楚如何同时访问标签之间的属性和数据。那么当在 ImageAccessor 类中设置 url 时,它如何知道它的大小?
      猜你喜欢
      • 2020-01-07
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多