gpt4 book ai didi

java - Jaxb Xml 到 java.awt

转载 作者:行者123 更新时间:2023-12-01 11:04:52 24 4
gpt4 key购买 nike

我在我的项目中使用 JAXB 进行 XML 出价,我还是一个初学者。现在我尝试将此 XML 文件绑定(bind)到类 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;
}


}

我希望任何人都可以给我建议如何处理这个问题。

干杯

最佳答案

不能自然映射到 XML 表示的类型需要编写 XmlAdapter实现中,FontColor 就是这样的类型。下面的代码展示了如何根据您的情况编写适配器的示例。

我将适配器类作为嵌套类放置在 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);
}
}

关于java - Jaxb Xml 到 java.awt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33055349/

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