我在我的项目中使用JAXB for XML,我还是初学者。 现在我尝试将此XML文件绑定到类 FontStyle
Xml文件看起来像这样
的example.xml
<fontStyle>
<font>
<family>Arial</family>
<style>0</style>
<size>12</size>
</font>
<fontColor>
<red>0</red>
<green>0</green>
<blue>0</blue>
</fontColor>
<backgroundColor>
<red>255</red>
<green>255</green>
<blue>255</blue>
</backgroundColor>
</fontStyle>
这是我的FontStyle类:
FontStyle.java
import java.awt.Color;
import java.awt.Font;
public class FontStyle {
private Font font;
private Color fontColor = Color.BLACK;
private Color backgroundColor = Color.WHITE;
public FontStyle() {
}
public FontStyle(Font font, Color fontColor, Color backgroundColor) {
this.font = font;
this.fontColor = fontColor;
this.backgroundColor = backgroundColor;
}
public Font getFont() {
return font;
}
public void setFont(Font font) {
this.font = font;
}
public Color getFontColor() {
return fontColor;
}
public void setFontColor(Color fontColor) {
this.fontColor = fontColor;
}
public Color getBackgroundColor() {
return backgroundColor;
}
public void setBackgroundColor(Color backgroundColor) {
this.backgroundColor = backgroundColor;
}
}
我希望有人能给我一个建议如何处理这个问题。
欢呼声
答案 0 :(得分:1)
不能自然映射到XML表示的类型需要编写XmlAdapter
实现,Font
和Color
就是这种类型。下面的代码提供了一个示例,说明如何在您的案例中编写适配器。
我将适配器类作为嵌套类放在FontStyle
类中,但如果愿意,可以将它们创建为外部类。
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.awt.*;
@XmlRootElement
@XmlType(propOrder = {"font", "fontColor", "backgroundColor"}) // to keep ordering consistent with "example.xml"
public class FontStyle {
private Font font;
private Color fontColor = Color.BLACK;
private Color backgroundColor = Color.WHITE;
public FontStyle() {
}
public FontStyle(Font font, Color fontColor, Color backgroundColor) {
this.font = font;
this.fontColor = fontColor;
this.backgroundColor = backgroundColor;
}
@XmlJavaTypeAdapter(FontAdapter.class)
public Font getFont() {
return font;
}
@XmlJavaTypeAdapter(ColorAdapter.class)
public Color getFontColor() {
return fontColor;
}
@XmlJavaTypeAdapter(ColorAdapter.class)
public Color getBackgroundColor() {
return backgroundColor;
}
public void setFont(Font font) {
this.font = font;
}
public void setFontColor(Color fontColor) {
this.fontColor = fontColor;
}
public void setBackgroundColor(Color backgroundColor) {
this.backgroundColor = backgroundColor;
}
private static class ColorAdapter extends XmlAdapter<ColorAdapter.ColorValueType, Color> {
@Override
public Color unmarshal(ColorValueType v) throws Exception {
return new Color(v.red, v.green, v.blue);
}
@Override
public ColorValueType marshal(Color v) throws Exception {
return new ColorValueType(v.getRed(), v.getRed(), v.getBlue());
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class ColorValueType {
private int red;
private int green;
private int blue;
public ColorValueType() {
}
public ColorValueType(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
}
}
private static class FontAdapter extends XmlAdapter<FontAdapter.FontValueType, Font> {
@Override
public Font unmarshal(FontValueType v) throws Exception {
return new Font(v.family, v.style, v.size);
}
@Override
public FontValueType marshal(Font v) throws Exception {
return new FontValueType(v.getFamily(), v.getStyle(), v.getSize());
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class FontValueType {
private String family;
private int style;
private int size;
public FontValueType() {
}
public FontValueType(String family, int style, int size) {
this.family = family;
this.style = style;
this.size = size;
}
}
}
}
解组 example.xml 并测试结果的代码如下所示:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class App {
public static void main(String[] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(FontStyle.class);
// unmarshall "example.xml"
File exampleFile = new File("example.xml");
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
FontStyle fontStyle = (FontStyle) jaxbUnmarshaller.unmarshal(exampleFile);
// marshall back to XML and print the result
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); // removes xml declaration line for consistency with "example.xml" file
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(fontStyle, System.out);
}
}
答案 1 :(得分:0)
Marcin的答案非常有效,但请注意以下代码行:
@Override
public ColorValueType marshal(Color v) throws Exception {
return new ColorValueType(v.getRed(), v.getRed(), v.getBlue());
}
如果您尝试在XML中编辑绿色,这将导致它被红色值覆盖,因为它两次调用v.getRed()
。
这将是正确的代码。
@Override
public ColorValueType marshal(Color v) throws Exception {
return new ColorValueType(v.getRed(), v.getGreen(), v.getBlue()); // Changed to getGreen().
}