2012-04-03 80 views
0

这是我的XML文件JAXB:请验证的XML结构到Java的JAXB

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

这是我的分析器类

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

您需要使用@XmlAttributeBag类的IDC变量。一旦你做了这个改变,你在顶部引用的XML将会起作用。

至于你当前的代码,它期待在XML的样子:

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

你可以很容易地看到你的类被填充的所有属性字段期待什么类型的XML,然后编组对象到文件。

更新

你应该总是声明你的属性为私有,如果你将拥有正确命名的getter和setter方法。否则,JAXB将抛出错误Class has two properties of the same name

当声明class属性为@XmlAttribute时,还应该将注释放在getter上,以便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 2012-04-03 17:33:09

+0

是的。我已经更新了答案,以表明这一点。 – 2012-04-03 17:52:40

+0

嗨,感谢您的及时回应,当我运行,我得到2 IllegalAnnotationExceptions计数,我已更新我的问题,请告诉我什么是错误 – Pawan 2012-04-03 18:10:32