Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xstream.toXML()XMLGregorianCalendar不应具有子元素_Java_Xml_Xstream - Fatal编程技术网

Java Xstream.toXML()XMLGregorianCalendar不应具有子元素

Java Xstream.toXML()XMLGregorianCalendar不应具有子元素,java,xml,xstream,Java,Xml,Xstream,下面是示例代码 public class Test { public static void main(String[] args) throws DatatypeConfigurationException { GregorianCalendar cal = new GregorianCalendar(); XMLGregorianCalendar xmlBirthDt = DatatypeFactory.newInstance().newXMLGre

下面是示例代码

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>

2018
10
15
-2147483648
-2147483648
-2147483648
-2147483648
下面是我所期望的(当根据模式验证生成的XML时,它会抛出错误:element date具有不被接受的子元素)

10-15-2018

我无法更改使用的库或更改模式,因为这是对现有庞大代码库的修改。请帮帮我。

我通过实现转换器和注册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);
}

为什么不创建自己的XMLGregorianCalendar对象,只在其中添加所需内容?所以你可以控制传递的数据。@Sir.Hedgehog我对代码做了更改。请现在检查。您可以尝试类似于XMLGregorianCalendar xgc=DatatypeFactory.newInstance().newXMLGregorianCalendar(newDateTime().toGregorianCalendar());如果你想先通过数据测试它。@Sir.Hedgehog,它没有任何区别。当您打印对象时,它会给出这样的数据(toString()方法会给出正确的输出)。但是当转换为xml时,子元素会显示出来。
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);
}