2009-05-08 17 views
3

このシナリオを検討してください。次のデータを含むperson.xmlというXMLファイルがあります。XML文書からJavaクラスを動的に生成

<person> 
    <name>MrFoo</name> 
    <age>28</age> 
</person> 

私はJavaオブジェクトには、このXMLを読みたい場合は、私のように(属性のゲッター/セッター付き)PersonBeanと呼ばれるJava Beanを作成することになります。

​​

そして、私は使用することができますXMLを読み込んでJava Beanに移入するためのAPI。

しかし実際のところ、XMLファイルの構造が変更された場合、つまり新しい属性 'email'がXMLファイルに追加された場合、新しい属性を追加するためにJava Beanを変更する必要があります。しかし、XML構造が変わってもJavaコードを変更しないようにしたい。

だから、私は何をやろうとしていることは、私のように、コンテンツとPersonStructure.xmlと呼ばれる別のXMLファイルを作成していますされています

<class name="Person"> 
    <attributes> 
     <attribute> 
      <name>personName</name> 
      <type>java.lang.String</type> 
     </attribute> 
     ... and it goes like this... 
    </attribute> 
</class> 

は、それはPersonStructure.XMLファイルを読み込んで変換することができますそれをPerson.Javaクラスファイルに入れますか?私がやろうとしているアプローチは正しいのですか、それとも同じように他の方法がありますか?

+0

あなたの新しいJavaコードは、あなたの新しい変更オブジェクトをどのようにしていますか?とにかく新しいバージョンのBeanを使用するためにビジネス・コードを変更する必要はありませんか? –

+0

あなたの質問のタイトルは正しいですか?あなたはJavaクラスではなく、Javaオブジェクトを生成したいと思うようです。 – skaffman

+0

XMLファイルからJavaクラス構造を作成したいと思います。 :) – Veera

答えて

7

これはまさにあなたがやろうとしていることではありませんが、JAXBを見てください。これは、スキーマ定義から一連のJavaクラスを生成できます。 PersonStructure.xmlファイルは、構文が異なるXSDのようにかなり見えるので、JAXBを再利用できます。 (私はほとんどの.NET男だ)は、Javaに精通

https://jaxb.dev.java.net/

+0

JAXB http://xmlbeans.apache.org/とほぼ同じXMLBeansを使用することもできます – HaBaLeS

4

ないが、しかし常識が適用されます。あなたには、いくつかのコントロールにそれらを結合することがありますしない限り、実際にはほとんど使用は(動的に生成されたBeanにありますその場合、Objectの配列はうまくいく)。

より具体的には、XSLTで行うことができる、このXML定義からのJava Beanのコード生成です。

PS。 XMLからプログラミング言語を作成しようとしないでください。あなたがそうするなら、地獄は間違いなく緩んでしまいます。

0

私は多かれ少なかれ同じ問題(私はJavaのデータをPOM.xmlファイルに変換する必要があります)を実行していますが、私にとってはうまくいかなかったことの1つですが、 XStreamのライブラリは、それはあなたが見てみる必要があり、XMLにJavaクラスを変換:

http://x-stream.github.io/

私はそれらに関連するとにかく、彼自身の答えを探しているだけのランダムな男にしています。このライブラリを使用する方法についてご質問がある場合は、それらに連絡してください。 あなたの問題を解決することを願っています。

0

可能な新しいフィールドに対応したいので、マップはクラスよりも便利です。

これに代えて、あなたの例を使用して例証する:

Person person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.name, person.age); 
person.age++; // happy birthday! 

...

Map<String, Object> person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age")); 
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first 
person.put("age", currentAge + 1); // happy birthday! 

はい、それはより多くのコードと少ないエラーチェックを(あなたは「名前」を間違えと何型チェックがありません場合、コンパイラはあなたを教えてくれません)を意味し、それは何をあなたの操作を行います。あなたはこれを行うだろう欲しいです。そして、ベストプラクティスを考えると、メンバーフィールドに直接アクセスするのではなく、ゲッターやセッターをコード化することです。実生活では、コードを書く必要はありません。

このルートに進む場合は、XMLとの変換方法についてはthis questionを参照してください。

関連する問題