JavaでXMLをParseするライブラリの一つにSimpleというものがあります。こいつはAndroidにも使えるので紹介します。
Simpleとは
POJOなオブジェクトに特定のannotationをつけると、そのオブジェクトとXMLを簡単に相互変換出来るようになる。すごくいいやつ。
http://simple.sourceforge.net/
インストール
Downloadのページから最新版をダウンロードします。
http://simple.sourceforge.net/download.php
ダウンロードした中身のjarフォルダの中身をAndroid Projectのlibsフォルダに入れればOK
Mavenを利用しているならpom.xmlに
<dependency> <groupId>org.simpleframework</groupId> <artifactId>simple-xml</artifactId> <version>2.6.9</version> </dependency>
を記述すればOK
サンプル
本家のTutorialから、XML –> POJOオブジェクトの方法について。
例えば以下のようなXMLがあった場合、
<root id="123"> <message>Example message</message> </root>
これを以下のPOJOの中にいれたい
@Root(name = "root") public class Example { @Element(name = "message") private String text; @Attribute(name = "id") private int index; public String getMessage() { return text; } public int getId() { return index; } }
この変換処理はSimpleを使えばこんなに簡単
String xml = "<root id="123"><message>Example message</message></root>"; Serializer serializer = new Persister(); try { Example example = serializer.read(Example.class, xml); } catch (Exception e) { e.printStackTrace(); }
ネストしたオブジェクトに変換する
XMLが深くネストしている場合はこんな感じ。要素名がクラス名やメンバ変数名を一致している場合はnameのプロパティを省略出来ます。
<configuration id="1234"> <server port="80"> <host>www.domain.com</host> <security ssl="true"> <keyStore>example keystore</keyStore> </security> </server> </configuration>
@Root public class Configuration { @Element private Server server; @Attribute private int id; public int getIdentity() { return id; } public Server getServer() { return server; } } public class Server { @Attribute private int port; @Element private String host; @Element private Security security; public int getPort() { return port; } public String getHost() { return host; } public Security getSecurity() { return security; } } public class Security { @Attribute private boolean ssl; @Element private String keyStore; public boolean isSSL() { return ssl; } public String getKeyStore() { return keyStore; } }
同じ要素が連続しているときはListに変換できる
<propertyList name="example"> <list> <entry key="one"> <value>first value</value> </entry> <entry key="two"> <value>first value</value> </entry> <entry key="three"> <value>first value</value> </entry> <entry key="four"> <value>first value</value> </entry> </list> </propertyList>
@Root public class PropertyList { @ElementList private List<Entry> list; @Attribute private String name; public String getName() { return name; } public List getProperties() { return list; } } @Root public class Entry { @Attribute private String key; @Element private String value; public String getName() { return name; } public String getValue() { return value; } }
必須では無いノードを指定する
XMLの中に必須ではないノードがある場合、required = falseのオプションの指定が必要です。
<optionalExample id="10"> <address>Some example address</address> </optionalExample>
@Root public class OptionalExample { @Attribute(required=false) private int version; @Attribute private String id; @Element(required=false) private String name; @Element private String address; public int getId() { return id; } public int getVersion() { return version; } public String getName() { return name; } public String getAddress() { return address; } }
その他の使い方等
本家サイトに大量に乗っているので参考にしてください。
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
http://simple.sourceforge.net/download/stream/doc/examples/examples.php