2

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

感谢您的帮助,毛里齐奥

4

2 回答 2

2

注意: 我是EclipseLink JAXB (MOXy)领导,是JAXB 2 (JSR-222)专家组的成员。

下面是 MOXy 的 JAXB 实现如何做到这一点Binder

数据豆

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>

了解更多信息

于 2012-04-03T10:12:31.167 回答
-1

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

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

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

当然这只是我个人的看法。但是请记住这两个工具并尝试使用它们。你会发现它真的很值得。

于 2012-04-03T08:30:58.647 回答