首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新到bean的部分XML映射

更新到bean的部分XML映射
EN

Stack Overflow用户
提问于 2012-04-03 14:28:27
回答 2查看 1.3K关注 0票数 2

我需要将节点的xml文件子集映射到Java Bean。

例如map

代码语言:javascript
复制
<data>
    <field1>Value</field1>
    <field2>Value</field2>
    <field3>Value</field3>
    <field4>Value</field4>
    <field5>Value</field5>
</data>

代码语言:javascript
复制
public class DataBean {
    private String field2;
    private String field5;
    // ...getter/setter
}

然后操作bean并更新源xml文件,而不会丢失未映射的元素。我如何使用才能做到这一点呢?什么库?

谢谢你的帮助,莫里齐奥

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 18:12:31

注:我是的负责人,也是JAXB 2 (JSR-222)专家组的成员之一。

下面是如何使用MOXy的JAXB Binder实现来实现这一点

DataBean

代码语言:javascript
复制
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的文件,

代码语言:javascript
复制
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

代码语言:javascript
复制
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);
    }

}

输出

代码语言:javascript
复制
<?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>

有关详细信息的,请访问

  • http://blog.bdoughan.com/2010/09/jaxb-xml-infoset-preservation.html
  • http://blog.bdoughan.com/2012/01/how-does-jaxb-compare-to-xmlbeans.html
  • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html
票数 2
EN

Stack Overflow用户

发布于 2012-04-03 16:30:59

如果决定结构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基础设施……

当然,这只是我个人的观点。但请记住这两个工具,并尝试使用它们。你会发现这是非常值得的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9988170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档