Xstream.toXML() XMLGregorianCalendar 不应有子元素
Xstream.toXML() XMLGregorianCalendar should not have child elements
下面是示例代码。
public class Test {
public static void main(String[] args) throws DatatypeConfigurationException {
GregorianCalendar cal = new GregorianCalendar();
XMLGregorianCalendar xmlBirthDt = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
XStream x = new XStream();
x.alias("date", XMLGregorianCalendar.class);
x.addDefaultImplementation(com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class, javax.xml.datatype.XMLGregorianCalendar.class);
String g = x.toXML(xmlBirthDt);
System.out.println(g);
}
}
下面是输出
<date>
<year>2018</year>
<month>10</month>
<day>15</day>
<timezone>-2147483648</timezone>
<hour>-2147483648</hour>
<minute>-2147483648</minute>
<second>-2147483648</second>
</date>
以下是我的预期(当生成的 XML 根据架构进行验证时,它会抛出错误:元素日期包含不被接受的子元素)
<date>10-15-2018</date>
我无法更改使用的库或架构,因为这是对现有庞大代码库的修改。请帮助我。
我通过实施 Converter 并使用 Xstream 注册解决了这个问题。下面是最终代码。
public static void main(String[] args) throws DatatypeConfigurationException {
GregorianCalendar cal = new GregorianCalendar();
XMLGregorianCalendar xmlBirthDt = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
XStream x = new XStream();
x.alias("date", com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class);
x.registerConverter(new Converter() {
@Override
public boolean canConvert(Class arg0) {
return arg0.equals(com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class);
}
@Override
public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) {
return null;
}
@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1, MarshallingContext arg2) {
XMLGregorianCalendar x = (XMLGregorianCalendar) arg0;
arg1.setValue(x.toString());
}
});
String g = x.toXML(xmlBirthDt);
System.out.println(g);
}
下面是示例代码。
public class Test {
public static void main(String[] args) throws DatatypeConfigurationException {
GregorianCalendar cal = new GregorianCalendar();
XMLGregorianCalendar xmlBirthDt = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
XStream x = new XStream();
x.alias("date", XMLGregorianCalendar.class);
x.addDefaultImplementation(com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class, javax.xml.datatype.XMLGregorianCalendar.class);
String g = x.toXML(xmlBirthDt);
System.out.println(g);
}
}
下面是输出
<date>
<year>2018</year>
<month>10</month>
<day>15</day>
<timezone>-2147483648</timezone>
<hour>-2147483648</hour>
<minute>-2147483648</minute>
<second>-2147483648</second>
</date>
以下是我的预期(当生成的 XML 根据架构进行验证时,它会抛出错误:元素日期包含不被接受的子元素)
<date>10-15-2018</date>
我无法更改使用的库或架构,因为这是对现有庞大代码库的修改。请帮助我。
我通过实施 Converter 并使用 Xstream 注册解决了这个问题。下面是最终代码。
public static void main(String[] args) throws DatatypeConfigurationException {
GregorianCalendar cal = new GregorianCalendar();
XMLGregorianCalendar xmlBirthDt = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
XStream x = new XStream();
x.alias("date", com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class);
x.registerConverter(new Converter() {
@Override
public boolean canConvert(Class arg0) {
return arg0.equals(com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.class);
}
@Override
public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) {
return null;
}
@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1, MarshallingContext arg2) {
XMLGregorianCalendar x = (XMLGregorianCalendar) arg0;
arg1.setValue(x.toString());
}
});
String g = x.toXML(xmlBirthDt);
System.out.println(g);
}