Symfoware

Symfowareについての考察blog

Java JAXBでXMLな文字列をオブジェクトにマッピングする

xml形式の文字列をオブジェクトにマッピングしたい。

文字列をInputStreamにして、SAXリーダーで読み込んで・・・

Javaで文字列(String)からInputStreamを生成し、DOMオブジェクトを作る
Java zip圧縮したxmlファイルをSAXリーダーで解析する

と思っていたのですが、Java 6から「JAXB」という機能が使える模様。
早速試してみます。


最初のサンプル



こちらを参考にさせていただきました。
JAXB使い方メモ


マッピングするオブジェクト

・Hoge.java


  1. public class Hoge {
  2.     private int id;
  3.     private String piyo;
  4.     
  5.     public int getId() {
  6.         return id;
  7.     }
  8.     public void setId(int id) {
  9.         this.id = id;
  10.     }
  11.     public String getPiyo() {
  12.         return piyo;
  13.     }
  14.     public void setPiyo(String piyo) {
  15.         this.piyo = piyo;
  16.     }
  17. }




XML解析は、JAXB.unmarshalで一撃です。

・Test.java


  1. import java.io.StringReader;
  2. import javax.xml.bind.JAXB;
  3. public class Test {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         String xml = "";
  8.         xml += "<hoge>";
  9.         xml += "    <id>10</id>";
  10.         xml += "    <piyo>日本語文字列</piyo>";
  11.         xml += "</hoge>";
  12.         
  13.         Hoge hoge = JAXB.unmarshal(new StringReader(xml), Hoge.class);
  14.         System.out.println(hoge.getId());
  15.         System.out.println(hoge.getPiyo());
  16.         
  17.     }
  18.     
  19. }




実行結果


10
日本語文字列




便利。これがJava 6から使えていたなんて・・・
ちゃんと勉強していないとダメですね。




アトリビュートをマッピング



アトリビュートをマッピングしたい場合は、アノテーション「@XmlAttribute」を
付与すればOKです。


・Hoge.java


  1. import javax.xml.bind.annotation.XmlAttribute;
  2. public class Hoge {
  3.     private int id;
  4.     private String piyo;
  5.     
  6.     public int getId() {
  7.         return id;
  8.     }
  9.     public void setId(int id) {
  10.         this.id = id;
  11.     }
  12.     
  13.     public String getPiyo() {
  14.         return piyo;
  15.     }
  16.     
  17.     @XmlAttribute
  18.     public void setPiyo(String piyo) {
  19.         this.piyo = piyo;
  20.     }
  21. }




・Test.java


  1. import java.io.StringReader;
  2. import javax.xml.bind.JAXB;
  3. public class Test {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         String xml = "";
  8.         xml += "<hoge piyo=\"日本語文字列\">";
  9.         xml += "    <id>10</id>";
  10.         xml += "</hoge>";
  11.         
  12.         Hoge hoge = JAXB.unmarshal(new StringReader(xml), Hoge.class);
  13.         System.out.println(hoge.getId());
  14.         System.out.println(hoge.getPiyo());
  15.         
  16.     }
  17.     
  18. }




実行結果


10
日本語文字列






タグ名の変更



ルートタグはクラス名。
要素の名称はget[名称]。

このルールを変更したい場合は、

・@XmlRootElement
・@XmlElement
・@XmlAttribute

のアノテーションに名前を設定してやります。


・Hoge.java


  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlElement;
  3. import javax.xml.bind.annotation.XmlRootElement;
  4. @XmlRootElement(name="hoge-root")
  5. public class Hoge {
  6.     private int id;
  7.     private String piyo;
  8.     
  9.     public int getId() {
  10.         return id;
  11.     }
  12.     
  13.     @XmlElement(name="id-tag")
  14.     public void setId(int id) {
  15.         this.id = id;
  16.     }
  17.     
  18.     public String getPiyo() {
  19.         return piyo;
  20.     }
  21.     
  22.     @XmlAttribute(name="piyo-attr")
  23.     public void setPiyo(String piyo) {
  24.         this.piyo = piyo;
  25.     }
  26. }




・Test.java


  1. import java.io.StringReader;
  2. import javax.xml.bind.JAXB;
  3. public class Test {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         String xml = "";
  8.         xml += "<hoge-root piyo-attr=\"日本語文字列\">";
  9.         xml += "    <id-tag>10</id-tag>";
  10.         xml += "</hoge-root>";
  11.         
  12.         Hoge hoge = JAXB.unmarshal(new StringReader(xml), Hoge.class);
  13.         System.out.println(hoge.getId());
  14.         System.out.println(hoge.getPiyo());
  15.         
  16.     }
  17.     
  18. }






ネスト




ノードのアトリビュートをマッピングしたい。


  1. <hoge>
  2.     <id piyo="日本語文字列">10</id>
  3. </hoge>




こんな時は、クラスがネストしていきます。


・IdTag.java


  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlValue;
  3. public class IdTag {
  4.     
  5.     private int id;
  6.     private String piyo;
  7.     
  8.     public int getValue() {
  9.         return id;
  10.     }
  11.     
  12.     @XmlValue
  13.     public void setValue(int id) {
  14.         this.id = id;
  15.     }
  16.     
  17.     public String getPiyo() {
  18.         return piyo;
  19.     }
  20.     
  21.     @XmlAttribute(name="piyo")
  22.     public void setPiyo(String piyo) {
  23.         this.piyo = piyo;
  24.     }
  25. }




・Hoge.java


  1. public class Hoge {
  2.     
  3.     private IdTag idTag;
  4.     
  5.     public IdTag getId() {
  6.         return idTag;
  7.     }
  8.     
  9.     public void setId(IdTag idTag){
  10.         this.idTag = idTag;
  11.     }
  12.     
  13. }





・Test.java


  1. import java.io.StringReader;
  2. import javax.xml.bind.JAXB;
  3. public class Test {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         String xml = "";
  8.         xml += "<hoge>";
  9.         xml += "    <id piyo=\"日本語文字列\">10</id>";
  10.         xml += "</hoge>";
  11.         
  12.         Hoge hoge = JAXB.unmarshal(new StringReader(xml), Hoge.class);
  13.         System.out.println(hoge.getId().getValue());
  14.         System.out.println(hoge.getId().getPiyo());
  15.         
  16.     }
  17.     
  18. }




実行結果


10
日本語文字列






関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/08/06(木) 22:16:51|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu 14.04にOpenJDK 8をインストールする | ホーム | Java JSONICでjsonな文字列をオブジェクトに直接デコード>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1782-6286eb1a
この記事にトラックバックする(FC2ブログユーザー)