gpt4 book ai didi

java - OBJECT 到 XML 和 XML 到 OBJECT 与 JAXBContext 和 Marshaller

转载 作者:行者123 更新时间:2023-11-30 11:53:20 25 4
gpt4 key购买 nike

    BufferedWriter out = new BufferedWriter(fstream);
try {
JAXBContext context = JAXBContext.newInstance(NarociloType.class);

Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

m.marshal(parameters, out);
out.newLine();
} catch (PropertyException pe) {
// TODO: Add catch code
pe.printStackTrace();
} catch (JAXBException jaxbe) {
// TODO: Add catch code
jaxbe.printStackTrace();
}

但空类型不会存储到 XML 中。例如:

NarociloType.date = null 

但我在 xml 中看不到 <date></date> .JAXB 编码不会为空值创建空元素

我还可以使用 JAXBContext 将 XML 更改为对象吗?

最佳答案

注意:以下示例适用于 EclipseLink JAXB (MOXy) ,但不是 Java SE 6 中包含的 JAXB 引用实现。

如果您使用 MOXy 作为 JAXB 提供程序(我是技术主管),那么您可以针对此用例使用 XmlAdapter

日期适配器

import java.util.Date;

import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import forum235.DateAdapter.AdaptedDate;

public class DateAdapter extends XmlAdapter<AdaptedDate, Date> {

@Override
public Date unmarshal(AdaptedDate adaptedDate) throws Exception {
return adaptedDate.date;
}

@Override
public AdaptedDate marshal(Date date) throws Exception {
AdaptedDate adaptedDate = new AdaptedDate();
adaptedDate.date = date;
return adaptedDate;
}

static class AdaptedDate {
@XmlValue
public Date date;
}

}

import java.util.Date;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Root {

private Date date;

@XmlJavaTypeAdapter(DateAdapter.class)
public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

}

演示

import java.util.Date;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

Root root = new Root();
marshaller.marshal(root, System.out);

root.setDate(new Date());
marshaller.marshal(root, System.out);
}

}

输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
<date/>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<date>2011-06-16T09:16:09.452</date>
</root>

jaxb.properties

您使用 MOXy 作为您的 JAXB 提供者,您需要在与您的域类相同的包中提供一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

有关 XmlAdapter 的更多信息

关于java - OBJECT 到 XML 和 XML 到 OBJECT 与 JAXBContext 和 Marshaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6367682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com