将部分XML映射更新为bean

时间:2012-04-03 06:28:27

标签: java xml javabeans xmlbeans xmlmapper

我需要将节点的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文件,而不会丢失未映射的元素。 我怎么用来做呢? 什么图书馆?

感谢您的帮助, 莫里吉奥

2 个答案:

答案 0 :(得分:1)

注意: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

要将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>

了解更多信息

答案 1 :(得分:-1)

如果您决定结构xml中的内容,那么您可以使用XStream(http://x-stream.github.io/)来序列化和反序列化。 但是如果你只是从xml反序列化为bean(来自外来格式),那么你应该使用Smooks(http://www.smooks.org/)。

与JAXB相比,这两个库都非常轻。 JAXB不灵活,需要创建XML Schema。我不建议,因为你比创建一个简单的DOM解析浪费更多的时间。

JAXB非常学术化。示例:WSDL文档未完全描述许多“SOAP信封”,但在WSDL字段中添加了一些xml(在简单的文本字段中)。在这种情况下,您将浪费大量时间来创建JAXB基础架构......

当然这只是我个人的意见。但请记住这两个工具并尝试使用它们。你会发现它确实值得。