Как использовать Jaxb для создания объектов Java - PullRequest
5 голосов
/ 26 января 2012

Я пытаюсь создать объекты Java из XML-файла.Я использую jaxb (unmarshalling) для создания объектов Java. Я получаю ошибки javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are

Я сделал несколько Google и обнаружил, что нам нужен xsd файл, чтобы сделать это ... поэтому я преобразовал его в xsdиспользуя инструмент apache inst2xsd.Я использую следующий код Java:

import java.io.FileNotFoundException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="report")
public class Report 
{
    public static void main(String [] args) throws FileNotFoundException
    {
        try
        {
            JAXBContext jc = JAXBContext.newInstance(new Class[] {com.bcbsks.testjb.Report.class});             
            Unmarshaller um = jc.createUnmarshaller();          
            Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd"));
        } 
        catch( UnmarshalException ue ) 
        {    
            ue.printStackTrace(); 
        } 
        catch( JAXBException je ) 
        { 
            je.printStackTrace(); 
        } 
    }
}

Но я получаю следующую ошибку:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are  (none)

Подскажите, пожалуйста, что я не так делаю?

Любая помощь с благодарностью.

Ответы [ 2 ]

6 голосов
/ 26 января 2012

Я думаю, вы пропустили несколько шагов. Вы не опубликовали ни то, что представляет собой report.xsd, ни пример xml, поэтому я собираюсь сделать несколько предположений.

Для начала, вы пытаетесь демонтировать xsd, а не xml, что само по себе является причиной проблемы. При этом ваш класс Report.java не выглядит сгенерированным должным образом, поэтому маловероятно, что ваш демаршаллинг сработает, даже если вы попытаетесь использовать файл XML.

Если у вас есть правильно созданный XSD-файл, первое, что вы должны сделать, - это создать JaxB POJO, используя xjc. xjc поставляется с java, и вы используете его для создания аннотированных классов java из xsd. Он также создаст 2 дополнительных файла - ObjectFactory.java и package-info.java, которые используются JAXB. (Вы можете указать выходной путь, используя параметр -d (полный список ключей см. В --help)

xjc -d c:\dev\myproject\src\main\java report.xsd

Как только вы сгенерируете эти файлы, вы должны создать свой JAXBContext на основе этого пакета / файла.

JAXBContext jc = JAXBContext.newInstance(something.generated.Report.class);             
Unmarshaller um = jc.createUnmarshaller();          
Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd"), Report.class).getValue();

Unmarshaller генерирует JAXBElement, из которого вы можете извлечь фактический класс отчета.

Надеюсь, это поможет.

4 голосов
/ 26 января 2012

На бобе нет свойств, которые вы пытаетесь разобрать. Но что более важно, вы пытаетесь десериализовать свой объект из самого XSD. Сообщение об ошибке является хорошим индикатором здесь:

unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema")

JAXB выплевывает это сообщение об ошибке, поскольку пытается сопоставить метаданные XSD со свойствами вашего компонента. Что, конечно, ваш боб на самом деле не имеет. Следующая часть сообщения об ошибке указывает столько же:

Expected elements are (none)

Вам нужно правильно определить ваш Java Bean (добавить некоторые свойства!) И получить XML-файл, представляющий сериализованную версию вашего Bean.

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