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