2010-12-05 5 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

私は一般的な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; 
    } 

    } 
+0

アイディアLiviuありがとう。私は、属性値とBeanプロパティを読み込むだけで終わった。サイズが 'medium'に設定されている場合、ブール値が設定され、画像の文字列値を上書きできるようになりました。 – smith324

0

私は可能ではないと思います。このようなフィルタリングを実行するには、独自のコードを記述する必要があります。

しかし、それは非常に簡単です。メソッドgetImage(String size)でImageAccessorという名前のクリーンコード書き込みクラスを作成する場合。このメソッドは、digesterからデータを取得し、定義済みのサイズ文字列(またはパターン)と比較します。

+0

を拡張します。だから、URLがImageAccessorクラスに設定されると、それはどのようなサイズであるかをどのように知っていますか? – smith324

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

}

関連する問題