Обновить частичное отображение XML на bean - PullRequest
2 голосов
/ 03 апреля 2012

Мне нужно отобразить подмножество файлов xml-файлов на Java Bean.

Например, карта

<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-файл, не теряя элементы, которые не отображаются. Как я могу использовать это сделать? Какая библиотека?

Спасибо за помощь, Maurizio

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Примечание: Я 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.properties

Чтобы указать MOXy в качестве вашего JAXB-провайдера, вам нужно добавить файл с именем 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>

Для получения дополнительной информации

0 голосов
/ 03 апреля 2012

Если вы решите, что входит в структуру xml, вы можете использовать XStream (http://x -stream.github.io / ) для сериализации и десериализации. Но если вы производите десериализацию только из xml в bean (из внешнего формата), вам следует использовать Smooks (http://www.smooks.org/).

)

Обе эти библиотеки очень легкие в отличие от JAXB. JAXB не является гибким и требует создания схемы XML. Я не рекомендую, потому что вы теряете больше времени, чем на простой анализ DOM.

JAXB очень академичен. Пример: многие из «конвертов SOAP» не полностью описаны в документах WSDL, но добавляют некоторое количество XML в поле WSDL (в простом текстовом поле). В таком случае вы теряете много времени на создание инфраструктуры JAXB ...

Конечно, это только мое личное мнение. Но помните эти два инструмента и попробуйте их использовать. Вы увидите, что это действительно стоит.

...