Jaxb Xml到java.awt

问题描述 投票:0回答:2

我在我的项目中使用JAXB进行XML绑定,我还是初学者。现在我尝试将此XML文件绑定到类字体样式

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类:

font style.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;
    }


}

我希望有人能给我一个如何处理这个问题的建议。

干杯

java xml jaxb
2个回答
1
投票

不自然地映射到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);
    }
}

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().
}
© www.soinside.com 2019 - 2024. All rights reserved.