2012-04-03 3 views
0

Это мой XML-файлJAXB: Пожалуйста, проверьте структуру для XML в Java в JAXB

<BADFM> 
<Given> 
<Ord> 
<Bag IDC="DM" /> 
</Ord> 
</Given> 
</BADFM> 

Это мой Parser класс

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 

public class Test { 
    public static void main(String args[]) throws Exception { 

     File file = new File("D:\\BADML.xml"); 
     JAXBContext jaxbContext = JAXBContext 
       .newInstance(MyMessage.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     MyMessage authentifyResult = (MyMessage) jaxbUnmarshaller 
       .unmarshal(file); 
     System.out.println(authentifyResult.getGiven().getOrd().getBag().getIDC()); 

    } 
} 

Это MyMessage

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="BADFM") 
public class MyMessage 
{ 
@XmlElement(name="Given") 
private Given given; 

public Given getGiven() { 
    return given; 
} 

public void setGiven(Given given) { 
    this.given = given; 
} 


} 

Это Given.java

import javax.xml.bind.annotation.XmlElement; 

public class Given { 
    private Ord ord; 
    @XmlElement(name = "Ord") 
    public Ord getOrd() { 
     return ord; 
    } 
    public void setOrd(Ord ord) { 
     this.ord = ord; 
    } 
} 

Это Ord.java

import javax.xml.bind.annotation.XmlElement; 

public class Ord { 

    private Bag bag; 
    @XmlElement(name="Bag") 
    public Bag getBag() { 
     return bag; 
    } 

    public void setBag(Bag bag) { 
     this.bag = bag; 
    } 

} 

Это Bag.java

import javax.xml.bind.annotation.XmlAttribute; 

public class Bag { 
     @XmlAttribute(name="IDC") 
    private String IDC ; 

    public String getIDC() { 
     return IDC; 
    } 
    @XmlAttribute(name="IDC") 
    public void setIDC(String IDC) { 
     IDC = IDC; 
    } 

} 

Когда я побежал, что я получаю

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "IDC" 
    this problem is related to the following location: 
     at public java.lang.String Bag.getIDC() 
     at Bag 
     at public Bag Ord.getBag() 
     at Ord 
     at public Ord Given.getOrd() 
     at Given 
     at public Given MyMessage.getGiven() 
     at MyMessage 
    this problem is related to the following location: 
     at private java.lang.String Bag.IDC 
     at Bag 
     at public Bag Ord.getBag() 
     at Ord 
     at public Ord Given.getOrd() 
     at Given 
     at public Given MyMessage.getGiven() 
     at MyMessage 

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source) 
    at javax.xml.bind.ContextFinder.find(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at Test.main(Test.java:11) 

ответ

1

Вы должны использовать @XmlAttribute для переменная IDC класса Bag. После того, как вы сделаете это изменение, XML, на который вы ссылаетесь, будет работать.

Что касается текущего кода, он ожидает, что XML выглядеть следующим образом:

<Bag> 
    <IDC>DM</IDC> 
</Bag> 

Вы можете легко увидеть, какой тип XML ваших классов ожидают, населяя все поля атрибутов, а затем выстраивая объект к файл.

Update

Вы всегда должны объявить свои атрибуты как частные, если вы собираетесь иметь должным образом названные методы получения и установки. В противном случае JAXB выдает ошибку Class has two properties of the same name.

При объявлении, что атрибут класса является @XmlAttribute, вы должны также положить аннотацию на поглотителе так, что JAXB не думает, что вы хотите, как в @XmlAttribute и @XmlElement с тем же именем.

public class Bag { 
    private String IDC ; 

    @XmlAttribute(name="IDC") 
    public String getIDC() { 
     return IDC; 
    } 

    public void setIDC(String IDC) { 
     this.IDC = IDC; 
    } 
} 
+0

Спасибо много, так что, если я использую @XmlAttribute для IDC будет код будет работать для этого XML <сумка IDC = "DM" /> Pawan

+0

Да. Я обновил ответ, чтобы сделать это понятным. –

+0

Привет, Спасибо за быстрый ответ. Когда я запустил это, я получаю 2 счета IllegalAnnotationExceptions, я обновил свой вопрос, пожалуйста, сообщите мне, что не так. – Pawan