fly1tkg blog

SimpleでXMLをParseする

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