ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのbeansからxmlへ変換

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんにちは
早速質問なんですが
beansからxmlへの変換にjakarta commons betwixtを使っています。
そこで変換はできたんですが要求通りの出力が得られません。
以下具体例を示します。

betwixtを用いてbeansを変換するクラス
------------------------------------------------
import java.io.FileWriter;

import org.apache.commons.betwixt.BindingConfiguration;
import org.apache.commons.betwixt.io.BeanWriter;

public class Test {
void toXml(Object o, String fileName) throws Exception{

//Configを作成 (idを出力しない) 省いてもいい。
BindingConfiguration config=new BindingConfiguration();
config.setMapIDs(false);

BeanWriter writer = new BeanWriter(new FileWriter(fileName));
writer.setBindingConfiguration(config);

writer.writeXmlDeclaration("<?xml version=\"1.0\"encoding=\"Shift_Jis\"?>");

//書き出し
writer.write(o);
writer.close();
}
public static void main(String[] args) {
// JavaBeanの値を設定
Library library = new Library();
library.addBook(new Book("新刊","aaa"));
library.addBook(new Book("週間","bbb"));

Test t = new Test();

try {
t.toXml(library, "test/library.xml");
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
------------------------------------------------
beans
Library.java
------------------------------------------------
import java.util.List;
import java.util.ArrayList;

public class Library{
List<Book> books=new ArrayList<Book>();

public void addBook(Book book){
books.add(book);
}

public Book[] getBooks(){
Book[] resultBooks=new Book[books.size()];
books.toArray(resultBooks);

return resultBooks;
}
}
-------------------------------------------------

beans
Book.java
-------------------------------------------------
public class Book{
private String name;
private String id;

public Book() {

}
public Book(String name, String id){
this.name=name;
this.id = id;
}

public void setName(String name){
this.name=name;
}
public void setId(String id) {
this.id = id;
}
public String getName(){
return this.name;
}
public String getId() {
return this.id;
}
}
---------------------------------------------------

Library.betwixt
---------------------------------------------------
<?xml version='1.0' encoding='Shift_Jis' ?>
<info>
<element name='library'>
<addDefaults/>
</element>
</info>
---------------------------------------------------

Book.betwixt
---------------------------------------------------
<?xml version='1.0' encoding='Shift_Jis' ?>
<info>
<element name='book'>
<attribute name="id" property="id"/>
<element name="name" property="name"/>
</element>
</info>
---------------------------------------------------

要求のxml
---------------------------------------------------
<?xml version="1.0" encoding="Shift_Jis"?>
<library>
<book id="aaa">
<name>新刊</name>
</book>
<book id="bbb">
<name>週間</name>
</book>
</library>
---------------------------------------------------

実際出力されたxml
---------------------------------------------------
<?xml version="1.0" encoding="Shift_Jis"?>
<library>
<books>
<book id="aaa">
<name>新刊</name>
</book>
<book id="bbb">
<name>週間</name>
</book>
</books>
</library>
---------------------------------------------------

実際出力されたxmlと要求のxmlの違いは<books>要素があるかないかです。
どこを変更すれば要求どおりのxmlに出力できるでしょうか。
できなければxsltで変換すればいいのかな。
よろしくお願いします。

コメント(13)

Stradaさん。

「質問者のXML構造にセンスがない」ってのがわからないので、補足してもらえませんか?

XML構造自体は問題ないように思えるんですが。。。。
1つのbeanに1つのpropertyしかないから省略したいってのが問題なんじゃないでしょうか。
他にもpropertyが増えることを考えるなら、要求がおかしい。

Libraly==booksなのに、Libralyからbooksを取得するのがおかしい。
後処理するのでも、getLibralyにして、root要素となるbean名(Libraly)を消す方が妥当な感じがする。Javaとしては私も同じように書くかもですけどね。
betwixtは使ったことないですけど、それで出来るのかな。
無理やりやるならこんなイメージなのでは?
試してないのであくまでイメージですが。

public static void main(String[] args) {
  // JavaBeanの値を設定
  Library library1 = new Library();
  Library library2 = new Library();
  Library library3 = new Library();
  
  //Bookをセットとかする
  
  
  List<Library> libraryItems = new ArrayList<Library>();
  libraryItems.add(library1);
  libraryItems.add(library2);
  libraryItems.add(library3);
  
  Test t = new Test();

  try {
    t.toXml(libraryItems, "test/library.xml");
  } catch (Exception e) {
    e.printStackTrace();
  }

}

-----
public class Library{
  private Book book;

  public Book getBook(){
    return book
  }
  
  public void setBook(Book book) {
    this.book = book;
  }
}
本人さん(shoさん)は、booksというタグは使うつもりはないんですよね?
betwixtのことはよく知らないので、ソースをパッと見た印象では、
出力になんでbooksっていうタグが出てくるのかが不思議ですが。。。
(ここを質問してるんでしょうけど。。。)

複数回出現するタグをまとめるときは、その複数形にするっていうのが常識的なルールであって、betwixtが自動的にそうしているというのであれば、
Stradaさんがいうことも理解できます。
(library というのが必要ないってことですね)
みなさんアドバイスありがとうございます。

>Stradaさん、おちくんさん
>複数回出現するタグをまとめるときは、その複数形にするっていうのが常識的なルールであって、betwixtが自動的にそうしているというのであれば、

やっぱり複数回あるタグはその複数形でまとめるのが常識なんですかね。
私も実際には自動生成されたxmlのほうがいいんじゃないかなと思います。
しかし、要求のxmlについては私が決めた仕様ではないため変更することはできません。

>Cappuccinoさん
>後処理するのでも、getLibralyにして、root要素となるbean名(Libraly)を消す方が妥当な感じがする。

getLibralyにしたとしても、残念ながらbetwixtはそれ(getLibraly)を保持するクラスの名前で勝手にroot要素を自動生成してくれます。

>souさん
toxml()にコレクションを引数で渡したらだめじゃないかな・・・っと思ったら出力できました!
---------------------------------------------------
<?xml version="1.0" encoding="Shift_Jis"?>
<ArrayList>
<book id="aaa">
<name>新刊</name>
</book>
<book id="bbb">
<name>週間</name>
</book>
</ArrayList>
---------------------------------------------------
ここからなら設定ファイルいじったら何とかなりそうです。

皆さんありがとうございます。
あとで一応ソース載せときます。
ここからなら設定ファイルいじったら何とかなりそうです。 とか言っといてどういじってもArrayListの要素名が変えれないorz
これはもう出力された一番最初に自動生成されたxmlファイルをいじったほうが早そうな気がしてきた。
ということで、正規表現かxsltかDOMかなにで変換するのがこの場合bestですかね?
7: shoさん
> getLibralyにしたとしても、残念ながらbetwixtはそれ(getLibraly)を保持するクラスの名前で勝手にroot要素を自動生成してくれます。

はい。要素を削除するならということでした。
(sho@0 さん)
> どこを変更すれば要求どおりのxmlに出力できるでしょうか。

原理は、よく分からないのですが、

-- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --
<?xml version='1.0' encoding='Shift_Jis' ?>
<info>
<element name='library'>
<element name='book' property='books'/>
<addDefaults/>
</element>
</info>
-- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --

と、 Library.betwixt に、
<element name='book' property='books'/>
を一行追加すると、どうやら、お望みの結果になるみたいです。

# この質問をみて、おもしろいなぁと思って色々試している間に、偶然、なったので、なぜ、これでよいのか、説明できません(ごめんなさい..)。

一応、参考にしたのは、
http://commons.apache.org/betwixt/guide/start.html
です。
>ぴょんぴょんさん
ありがとうございます。
たしかに要求通りの結果になってますね!
何でこうなるんだろうか・・・。
もう少しbetwixtファイルの書き方を調べてみます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング