JAXB: исключение приведения класса при попытке демонтировать XML с использованием JAXB - PullRequest
3 голосов
/ 04 мая 2010

Я новичок в JAXB, я пытаюсь попробовать JAXB.

пытается отобразить значения в MenuList.xml

---- MenuList.xml -----------

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<menulist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Category1 name="Development">
        <MenuItem1>Projects</MenuItem1>
        <MenuItem2>Library</MenuItem2>
        <MenuItem3>Library1</MenuItem3>
    </Category1>    
</menulist>

---------------------------- MenuList.xsd ---------------- ---

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio Developer Edition (Trial) 8.0.11.2171 (http://www.liquid-technologies.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="menulist">
        <xs:complexType>
            <xs:sequence>
                <xs:element  name="Category1">
                    <xs:complexType>
                        <xs:attribute name="MenuItem1" type="xs:string" use="required" />
                        <xs:attribute name="MenuItem2" type="xs:string" use="required" />
                        <xs:attribute name="MenuItem3" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

С помощью команды я запускаю файл xsd, и он генерирует классы. MenuList и Object Factory.

AppTest.java

package com.xx.menu;

import java.io.File;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;

public class TestNew {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
        JAXBContext jc = JAXBContext.newInstance("com.xx.menu");        //Create unmarshaller
        Unmarshaller um = jc.createUnmarshaller();

        File file = new File ("C:\\sample\\menulist.xml");

        JAXBElement element = (JAXBElement)um.unmarshal(file);

        Menulist menulist= (Menulist) element.getValue ();
        System.out.println("name : "+menulist.getMenu());

        }
     catch( UnmarshalException ue ) {
         ue.printStackTrace();
        System.out.println( "Caught UnmarshalException" );
    } catch( JAXBException je ) { 
        je.printStackTrace();
    } catch( Exception ioe ) {
        ioe.printStackTrace();
    }
    }

}

Ошибка:

java.lang.ClassCastException: com.xx.menu.Menulist
    at com.xx.menu.TestNew.main(TestNew.java:26)

Не могли бы вы помочь мне, где я иду не так ... Я буду очень благодарен вам.

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Вы слишком усложняете вещи. Вам не нужно копаться с JAXBElement, если Unmarshaller дает вам объект Menulist напрямую. ClassCastExcepotion в значительной степени говорит вам, что вам нужно сделать:

Menulist menulist= (Menulist) um.unmarshal(file);

JAXBElement используется только в определенных конкретных ситуациях, и это не одна из них.

1 голос
/ 20 декабря 2013

Не могли бы вы добавить краткое описание того, когда JAXBElement должен использоваться?

JAXBElement используется JAXB, когда класс или свойство не содержат достаточно информации, чтобы указать, какой элемент должен быть записан в XML.

@ XmlRootElement

В вашем примере класс Menulist соответствует элементу menulist. Поскольку в схеме этот элемент имеет анонимный комплексный тип, один элемент связан с классом, сгенерированным из соответствующего комплексного типа.

@ XmlElementDecl

Если в вашем примере элемент menulist соответствовал названному сложному типу, то потенциально несколько элементов могли бы соответствовать одному и тому же классу, сгенерированному из этого сложного типа. Вместо того, чтобы аннотировать класс с помощью @XmlRootElement, для класса ObjectFactory будет сгенерирована одна или несколько аннотаций @XmlElementDecl. Это может привести к несоблюдению JAXBElement.

Обработка всех результатов

Если вы не знаете, будет ли возвращен JAXBElement, вы можете использовать JAXBIntrospector, чтобы выполнить любое необходимое развертывание.

    JAXBIntrospector ji = jaxbContext.createJAXBIntrospector();
    Menulist menulist = (Menulist) ji.getValue(unmarshaller.unmarshal(xml));

Для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...