2

私は 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");が欲しいのですが、それはできません。

4

3 に答える 3

2

一般的なゲッター/セッターを省略しました。

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

  }
于 2010-12-05T17:53:32.537 に答える
1

私は実際にxmlpullparserを使用してこれを理解しました-これは画像属性「large」のみを取得し、残りを無視するコードです-これは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;
}

}

于 2011-02-24T12:24:10.477 に答える
0

可能だとは思いません。この種のフィルタリングを実行するには、独自のコードを作成する必要があります。

しかし、それは非常に簡単です。クリーンなコードを作成する場合は、メソッドを使用してImageAccessorという名前のクラスを記述しますgetImage(String size)。このメソッドは、ダイジェスターからデータを取得し、事前定義されたサイズの文字列(またはパターン)と比較します。

于 2010-12-05T07:42:18.870 に答える