2

ノードのxmlファイルサブセットをJavaBeanにマップする必要があります。

たとえば地図

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

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

次に、Beanを操作し、マップされていない要素を失うことなくソースxmlファイルを更新します。どうすればそれを行うことができますか?どの図書館?

助けてくれてありがとう、マウリツィオ

4

2 に答える 2

2

注: 私はEclipseLink JAXB(MOXy)が、 JAXB 2(JSR-222)エキスパートグループのメンバーを率いています。

以下は、MOXyのJAXBの実装でこれを行う方法ですBinder

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.properties

JAXBプロバイダーとしてMOXyを指定するにはjaxb.properties、ドメインクラスと同じパッケージで名前が付けられたファイルを次のエントリで追加する必要があります。

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

デモ

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);
    }

}

出力

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
    <field1>Value</field1>
    <field2>NEW FIELD 2</field2>
    <field3>Value</field3>
    <field4>Value</field4>
    <field5>NEW FIELD 5</field5>
</data>

詳細については

于 2012-04-03T10:12:31.167 に答える
-1

構造体xmlに何を含めるかを決定する場合は、XStream(http://x-stream.github.io/)を使用してシリアル化および逆シリアル化できます。ただし、xmlからbean(外部形式から)にのみ逆シリアル化する場合は、Smooks(http://www.smooks.org/)を使用する必要があります。

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

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

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

于 2012-04-03T08:30:58.647 に答える