Java 将部分XML映射更新为bean
我需要将节点的xml文件子集映射到JavaBean 例如地图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
<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。