Skip to content

Instantly share code, notes, and snippets.

@zaneli
Created January 28, 2012 13:14
Show Gist options
  • Save zaneli/1694266 to your computer and use it in GitHub Desktop.
Save zaneli/1694266 to your computer and use it in GitHub Desktop.
「Commons Digester で XML to Java バインディング」ブログ用
package com.zaneli.xml.bind;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.commons.digester3.Digester;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.zaneli.xml.model.Content;
import com.zaneli.xml.model.Entry;
import com.zaneli.xml.model.Feed;
import com.zaneli.xml.model.Link;
import com.zaneli.xml.model.Person;
public class FeedDigester {
private static final Digester digester;
static {
digester = new Digester();
// XML 名前空間をサポートするように指定
digester.setNamespaceAware(true);
// ルートのデフォルト名前空間を設定
digester.setRuleNamespaceURI("http://www.w3.org/2005/Atom");
digester.addObjectCreate("feed", Feed.class);
digester.addObjectCreate("feed/entry", Entry.class);
digester.addSetNext("feed/entry", "setEntry");
digester.addObjectCreate("feed/entry/content", Content.class);
digester.addSetNext("feed/entry/content", "setContent");
// content の type 属性を Content クラスの type プロパティにセット
digester.addSetProperties("feed/entry/content", "type", "type");
// person のデフォルト名前空間を設定
digester.setRuleNamespaceURI("http://ns.opensocial.org/2008/opensocial");
digester.addObjectCreate("feed/entry/content/person", Person.class);
digester.addSetNext("feed/entry/content/person", "setPerson");
digester.addBeanPropertySetter("feed/entry/content/person/id");
digester.addBeanPropertySetter("feed/entry/content/person/displayName");
digester.addBeanPropertySetter("feed/entry/content/person/nickname");
digester.addBeanPropertySetter("feed/entry/content/person/thumbnailUrl");
digester.addBeanPropertySetter("feed/entry/content/person/lastLogin");
digester.addBeanPropertySetter("feed/entry/content/person/userHash");
digester.addBeanPropertySetter("feed/entry/content/person/platformUserId");
// ルートのデフォルト名前空間を設定
digester.setRuleNamespaceURI("http://www.w3.org/2005/Atom");
digester.addBeanPropertySetter("feed/entry/title");
digester.addBeanPropertySetter("feed/entry/updated");
digester.addBeanPropertySetter("feed/entry/author");
digester.addBeanPropertySetter("feed/entry/id");
digester.addObjectCreate("feed/entry/link", Link.class);
digester.addSetNext("feed/entry/link", "setLink");
// link の 全属性を Link クラスの同名プロパティにセット
digester.addSetProperties("feed/entry/link");
// osearch プレフィックスの名前空間を設定
digester.setRuleNamespaceURI("http://a9.com/-/spec/opensearch/1.1");
digester.addBeanPropertySetter("feed/startIndex", "startIndex");
digester.addBeanPropertySetter("feed/totalResults", "totalResults");
}
public Feed parse(InputStream in) throws IOException, SAXException {
return digester.parse(in);
}
public Feed parse(File file) throws IOException, SAXException {
return digester.parse(file);
}
public Feed parse(InputSource source) throws IOException, SAXException {
return digester.parse(source);
}
public Feed parse(Reader reader) throws IOException, SAXException {
return digester.parse(reader);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment