2012-04-03 22 views
1

ノードのxmlファイルのサブセットをJava Beanにマップする必要があります。Beanへの部分XMLマッピングの更新

public class DataBean { 
    private String field2; 
    private String field5; 
    // ...getter/setter 
} 

例えばマップについて

<data> 
    <field1>Value</field1> 
    <field2>Value</field2> 
    <field3>Value</field3> 
    <field4>Value</field4> 
    <field5>Value</field5> 
</data> 

次に豆を操作し、マッピングされていない要素を失うことなく、ソースXMLファイルを更新します。 どのようにしてそれを行うことができますか? どのライブラリですか?あなたは、構造のXMLであるかを決める場合は、ヘルプのための

おかげで、 マウリツィオ

+0

するTry JAXB(http://jaxb.java.net/tutorial/) – Luca

+0

がどのように実行することができますJAXBでのそのタスクは?私にサンプルをリンクできますか? – dash1e

答えて

1

注:私はEclipseLink JAXB (MOXy)JAXB 2 (JSR-222)専門家のメンバーです。以下は

が、これはJAXB BinderのMOXYの実装を行うことができる方法である。

databeanは

package forum9988170; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="data") 
public class DataBean { 

    private String field2; 
    private String field5; 

    public String getField2() { 
     return field2; 
    } 

    public void setField2(String field2) { 
     this.field2 = field2; 
    } 

    public String getField5() { 
     return field5; 
    } 

    public void setField5(String field5) { 
     this.field5 = field5; 
    } 

} 

JAXB。

性質

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

デモ、あなたは次のエントリを使用して、ドメインクラスと同じパッケージにjaxb.propertiesという名前のファイルを追加する必要があり、あなたのJAXBプロバイダとしてMOXYを指定するには

package forum9988170; 

import java.io.File; 
import javax.xml.bind.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(DataBean.class); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     File xml = new File("src/forum9988170/input.xml"); 
     Document document = db.parse(xml); 

     Binder<Node> binder = jc.createBinder(); 
     DataBean dataBean = (DataBean) binder.unmarshal(document); 
     dataBean.setField2("NEW FIELD 2"); 
     dataBean.setField5("NEW FIELD 5"); 
     binder.updateXML(dataBean); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     DOMSource source = new DOMSource(document); 
     StreamResult result = new StreamResult(System.out); 
     t.transform(source, result); 
    } 

} 

出力

詳細情報

+0

非常にうまく動作し、EclipseLinkを使用して、私はxpath、beautifulを使用してマップできます。しかし、もし@XmlPathが必要ないのであれば、標準のJAXBでも同じことができますか? – dash1e

+1

@MaurizioMerli - EclipseLink MOXyは、すべてのJAXBおよびJava EE準拠テストに合格する標準のJAXB/JSR-222(http://jcp.org/ja/jsr/detail?id=222)実装です。私はしばらくの間、その専門家グループのメンバーになっています(JAXB仕様のセクション1.5を参照してください)。 JAXBのリファレンス実装では、バインダーの実装が異なるように見えますが、私はいつもその実装のバグを考えていました。 –

+1

ありがとう、Blaise。今日、あなたは私にすばらしい機能を教えてくれます! – dash1e

-1

は、あなたがシリアライズおよびデシリアライズするXStreamの(http://x-stream.github.io/)を使用することができます。 xmlからbean(外部フォーマットのもの)のみを逆シリアル化する場合は、Smooks(http://www.smooks.org/)を使用する必要があります。

JAXBとは対照的に、これらのライブラリはどちらも非常に軽いです。 JAXBは柔軟性がなく、XMLスキーマを作成する必要があります。あなたが単純なDOM解析を作成するよりも時間を失うので、私はお勧めしません。

JAXBは非常に学業です。例:「SOAPエンベロープ」の多くはWSDLドキュメントでは完全には記述されていませんが、単純なテキストフィールドではWSDLフィールドにxmlが追加されています。このような場合、JAXBインフラストラクチャを作成するために多くの時間を失います。

もちろんこれは私の個人的意見です。しかし、これらの2つのツールを覚えて、それらを使用しようとします。それは本当に価値があることがわかります。

+0

XStreamでは、ソースXMLドキュメントを更新できます。マッピングされたフィールドのみを変更し、他のxml要素を不変とすることができますか? – dash1e

+0

JAXB(JSR-222)の実装ではXMLスキーマ(http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics)は不要で、XStream(http: //blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html)。 JAXBはJAX-WSを利用してSOAPメッセージを作成しますが、それ自体でも使用されます。 JAXBは他のエンタープライズアプリケーションで使用されているため、ほとんど「学術的」ではありません。 –

+0

Blaise:データ型を記述するJAXBスキーマが必要です。http://jaxb.java.net/tutorial/section_2_1-Writing-an-XML-Schema-for-JAXB.html#Writing%20an%20XML%20Schema%20for %20JAXB、およびhttp://jaxb.java.net/tutorial/section_1_3-Hello-World.html#Hello%20Worldにあります。もちろん、JAXBにはスキーマビルダーが含まれています。 – wojand

関連する問題