Xstream.toXML () XMLGregorianCalendar не должен иметь дочерних элементов - PullRequest
0 голосов
/ 15 октября 2018

Ниже приведен пример кода.

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 имеет дочерние элементы, которые не принимаются)

<date>10-15-2018</date>

Я не могу изменить используемые библиотеки или изменить схему, поскольку это изменение существующей огромной базы кода.Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 16 октября 2018

Я решил это путем реализации 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);
}
...