Java 将部分XML映射更新为bean

Java 将部分XML映射更新为bean,java,xml,javabeans,xmlbeans,xmlmapper,Java,Xml,Javabeans,Xmlbeans,Xmlmapper,我需要将节点的xml文件子集映射到JavaBean 例如地图 <data> <field1>Value</field1> <field2>Value</field2> <field3>Value</field3> <field4>Value</field4> <field5>Value</field5> </data&g

我需要将节点的xml文件子集映射到JavaBean

例如地图

<data>
    <field1>Value</field1>
    <field2>Value</field2>
    <field3>Value</field3>
    <field4>Value</field4>
    <field5>Value</field5>
</data>
然后操纵bean并更新源xml文件,而不丢失未映射的元素。 我该怎么做呢? 什么图书馆

谢谢你的帮助,
Maurizio

如果您决定xml的结构是什么,那么您可以使用XStream()来序列化和反序列化。 但是,如果只将xml反序列化为bean(从外部格式),那么应该使用Smooks()

与JAXB相比,这两个库都非常轻巧。JAXB不灵活,需要创建XML模式。我不建议这样做,因为您损失的时间比创建一个简单的DOM解析要多

JAXB非常学术化。示例:许多“SOAP信封”不是由WSDL文档完全描述的,而是将一些xml添加到WSDL字段(在一个简单的文本字段中)。在这种情况下,创建JAXB基础设施会浪费很多时间


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

注意:我是专家组的组长和成员

下面是MOXy实现JAXB
活页夹的方法:

数据库

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

}
用于UM9988170的包;
导入java.io.File;
导入javax.xml.bind.*;
导入javax.xml.parsers.*;
导入javax.xml.transform.*;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(DataBean.class);
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
文件xml=新文件(“src/forum9988170/input.xml”);
Document=db.parse(xml);
Binder Binder=jc.createBinder();
DataBean DataBean=(DataBean)binder.unmarshal(文档);
dataBean.setField2(“新字段2”);
dataBean.setField5(“新字段5”);
binder.updateXML(数据库);
TransformerFactory tf=TransformerFactory.newInstance();
变压器t=tf.新变压器();
DOMSource=新的DOMSource(文档);
StreamResult结果=新的StreamResult(System.out);
t、 转化(来源、结果);
}
}
输出

<?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>

价值
新领域2
价值
价值
新领域5
了解更多信息

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(),我如何使用jaxb执行该任务?您能给我链接一个示例吗?因此,使用XStream,我能够更新源xml文档,只更改映射字段,并允许其他xml元素不变吗?JAXB(JSR-222)实现不需要xml模式(),与XStream()相比,它非常轻量级且易于使用。JAX-WS利用JAXB创建SOAP消息,但也可以单独使用。JAXB很难说是“学术性的”,因为它在更多的企业应用程序中使用,而不是其他应用程序。Blaise:JAXB需要描述数据类型、look to和to的模式。JAXB当然包含模式生成器。@wojand-相信我,JAXB(JSR-222)实现不需要XML模式。对于许多例子,请查看我的博客:Maurizio:XStream是为编写XML代码片段而设计的。因此,您不需要编写任何定义xml结构的xml文档。但这只是一个序列化工具。可能比JAXB快,因为可以使用XPP解析器。对于绑定外来格式,Smooks更好。请不要误解我的意思,JAXB是一个不错的工具:-)一切都取决于您真正需要它的内容。很棒的工作非常好,使用EclipseLink,我可以使用xpath进行映射,非常漂亮。但是,如果我不需要@XmlPath,我可以用标准JAXB做同样的事情吗?@MaurizioMerli-EclipseLink-MOXy是通过所有JAXB和JavaEE符合性测试的标准JAXB/JSR-222()实现。我已经成为该专家组的成员一段时间了(参见JAXB规范第1.5节)。
Binder
的JAXB参考实现的行为似乎有所不同,我一直认为这是该实现中的一个bug。