简体   繁体   English

JAXB2Marshaller未将xml元素编组为Character

[英]JAXB2Marshaller not unmarshaling xml element into Character

I am having problem unmarshalling xml element into character using JAXB2Marshaller. 我在使用JAXB2Marshaller将xml元素分解为字符时遇到问题。

My XML input contains one element <dateCheckFlag>Y</dateCheckFlag> : when I try to get dateCheckFlag element value into Character type in my pojo, it gives me null. 我的XML输入包含一个元素<dateCheckFlag>Y</dateCheckFlag> :当我尝试在pojo dateCheckFlag元素值转换为Character类型时,它为空。

Assume all setter getter and constructor are present. 假设存在所有的setter getter和构造函数。

Can anybody help me out how to unmarshall xml element into Character...? 有人可以帮我解决如何将xml元素编组为Character ...吗?

@XmlRootElement(name="Emp")
class Emp
{
    @XmlElement(name="name");
        String name;
    @XmlElement(name="dateCheckFlag");
        Character dateCheckFlag;
Emp(){}

Emp(String name, Character dateCheckFlag)
{ 
 this.name= name;
 this.dateCheckFlag = dateCheckFlag;
}

public void setName(String name)
{
 this.name=name;
}
public String getName()
{
 return name;
}

public void setDateCheckFlag(Character flag)
{
 this.dateCheckFlag=flag;
}
public Character getName()
{
 return dateCheckFlag;
}

The JAXB (JSR-222) specification does not define the XML representation for char / Character . JAXB(JSR-222)规范未定义char / Character的XML表示形式。 By default that JAXB reference implmentation converts a Character to the xs:unsignedShort type. 默认情况下,JAXB参考实现将一个Character转换为xs:unsignedShort类型。 This means that it is expecting a document like: 这意味着它期望的文档如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Emp>
    <name>Jane Doe</name>
    <dateCheckFlag>89</dateCheckFlag>
</Emp>

XmlAdapter XmlAdapter

You will be able to use an XmlAdapter to get the XML that you are looking for. 您将能够使用XmlAdapter来获取所需的XML。 An XmlAdapter allows you to convert one object to another for the purposes of changing the XML representation. XmlAdapter允许您将一个对象转换为另一个对象,以更改XML表示形式。

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CharacterAdapter extends XmlAdapter<String, Character> {

    @Override
    public Character unmarshal(String string) throws Exception {
        return string.charAt(0);
    }

    @Override
    public String marshal(Character character) throws Exception {
        return new String(new char[] {character});
    }

}

Emp EMP

The @XmlJavaTypeAdapter annotation is used to specify the XmlAdapter . @XmlJavaTypeAdapter批注用于指定XmlAdapter

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

@XmlRootElement(name = "Emp")
@XmlAccessorType(XmlAccessType.FIELD)
class Emp {

    String name;

    @XmlJavaTypeAdapter(CharacterAdapter.class)
    Character dateCheckFlag;

}

Demo 演示

Below is some code that converts the XML to/from the object model. 下面是一些将XML与对象模型转换的代码。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Emp.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15240702/input.xml");
        Emp emp = (Emp) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(emp, System.out);
    }

}

input.xml/Output input.xml中/输出

<?xml version="1.0" encoding="UTF-8"?>
<Emp>
    <name>Jane Doe</name>
    <dateCheckFlag>Y</dateCheckFlag>
</Emp>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM