我正在使用JAXB进行编组和解组对象。我有一个Class MyBean
字符串列表作为字段,并注明@XmlAttribute
。
@XmlRootElement
public class MyBean {
public MyBean() {
super();
}
private List<String> actualValue;
@XmlAttribute
public List<String> getActualValue() {
if (actualValue == null) {
actualValue = new ArrayList<String>();
}
return actualValue;
}
public void setActualValue(List<String> values) {
this.actualValue = values;
}
}
以下是用于封送和取消封送MyBean的Test类。
public class Test {
public static void main(String[] args) {
try {
// create object ....
MyBean myBean = new MyBean();
List<String> values = new ArrayList<String>();
values.add("Sanjv Singh Baghel");
myBean.setActualValue(values);
// Marsheling
File file = new File("D://Temp//hello2.xml");
JAXBContext jaxbContext2 = JAXBContext.newInstance(MyBean.class);
Marshaller jaxbMarshaller2 = jaxbContext2.createMarshaller();
jaxbMarshaller2.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller2.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
jaxbMarshaller2.marshal(myBean, file);
// Un-Marsheling
JAXBContext jaxbContext = JAXBContext.newInstance(MyBean.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
// printing actual value
MyBean myBean2 = (MyBean) jaxbUnmarshaller.unmarshal(file);
List<String> actualValue = myBean2.getActualValue();
System.out.println(actualValue);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
Before actualValue : ["sanjv singh baghel"]
After actualValue : ["sanjv, singh, baghel"]
奇怪的是,我在这里面对的是原始actualValue
只有一个带空格的字符串,在取消编组后,该单个字符串将转换为字符串列表(除以空格)。
我想知道为什么会发生这种情况/它有什么问题。
因为,我找到了两种可能的解决方案:
@XmlAttribute
替换为@XmlElement
List<String> actualValue;
&amp;字符串需要映射到模式简单类型答案 0 :(得分:4)
XML Schema具有数据类型列表的概念。
<xs:attribute name="actualValue">
<xs:simpleValue>
<xs:list itemType="xs:string"/>
<xs:simpleValue>
</xs:attribute>
这在XML中表示为空格分隔值。
<foo actualValue="one two three"/>
这是您通过将@XmlAttribute
注释放在List<String>
类型的属性上而要求JAXB执行的操作。请参阅@XmlAttribute
的javadoc中的“示例3”。
如果您将@XmlAttribute
替换为@XmlElement
,您将获得以下代表:
<foo>
<actualValue>one</actualValue>
<actualValue>two</actualValue>
<actualValue>three</actualValue>
</foo>