2013-09-11 8 views
2

У меня очень похожая проблема в этой теме unexpected element error while unmarshalling, но все же я не могу решить исключение. Поскольку пространство имен в XML и package-info точно такое же ... или это из-за xsd-файла?Unmarshalling неожиданный элемент error

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.example.org/Uni", local:"Uni"). Expected elements are <{http://www.example.org/Uni}uni> 

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<tns:Uni xmlns:tns="http://www.example.org/Uni" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Uni Uni.xsd "> 
    <tns:Semester> 
    <tns:nr>1</tns:nr> 
    <tns:datum>01.02.2012</tns:datum> 
    </tns:Semester> 
    <tns:Semester> 
    <tns:nr>2</tns:nr> 
    <tns:datum>01.02.2012</tns:datum> 
    </tns:Semester> 
</tns:Uni> 

XSD

<complexType name="Uni"> 
    <choice> 
     <element name="Semester" type="tns:Semester" maxOccurs="unbounded"></element> 
    </choice> 
</complexType> 

<complexType name="Semester"> 
    <sequence> 
     <element name="nr" type="int"></element> 
     <element name="datum" type="string"></element> 
    </sequence> 
</complexType> 

пакет-инфо

@javax.xml.bind.annotation.XmlSchema(
     namespace = "http://www.example.org/Uni", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package parserTest; 

Uni.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Uni 
{ 

    @XmlElement(name = "Semester") 
    protected List<Semester> semester; 

    public List<Semester> getSemester() 
    { 
     if (this.semester == null) 
     { 
      this.semester = new ArrayList<Semester>(); 
     } 
     return this.semester; 
    } 

} 

Демаршаллизация

public static void main(String[] args) throws JAXBException 
{ 
    ObjectFactory factoryForElementObjects = new ObjectFactory(); 
    List<Semester> semesterL = new ArrayList<Semester>(); 

    Uni uni = new Uni(); 
    uni.semester = semesterL; 

    JAXBContext context = JAXBContext.newInstance(Uni.class); 
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    Uni un = (Uni) unmarshaller.unmarshal(new File("src/main/resources/Uni.xml")); 
    List<Semester> semesterA = un.semester; 
    System.out.println(semesterA.get(0).nr); 
} 

ответ

3

Проблема заключается в том, что unmarshaller ожидает элемент uni, но он находит Uni.

Установка имени элемента XML для класса Uni должен сделать трюк:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "Uni") 
public class Uni 
{ 

    @XmlElement(name = "Semester") 
    protected List<Semester> semester; 

    public List<Semester> getSemester() 
    { 
     if (this.semester == null) 
     { 
      this.semester = new ArrayList<Semester>(); 
     } 
     return this.semester; 
    } 

} 
+0

Thx .. Я помечать как ответил ... только почему он ожидает уни, я использовал только заглавные буквы, Я вижу до сих пор ... или из-за объекта uni? – Fendrix

+1

Ну, я не эксперт в JAXB, но я думаю, что он всегда будет «предпочитать» создание элементов XML с нижним регистром. Нашел ответ, упорядочивающий объект 'Uni'. –

+0

возможно ... u re right ... все теги должны быть в нижнем регистре ... – Fendrix

Смежные вопросы