2013-03-26 52 views
4

JAXB @XmlIDREF @XmlID做工令人惊讶的JAXB @XmlIDREF @XmlID工作惊人

我的XML输入

<dept> 
    <courses> 
     <course id="1" units="4" level="UNDERGRAD" name="Fundamentals of Programming"/> 
     <course id="2" units="3" level="UNDERGRAD" name="Advanced Programming"> 
      <pre>1</pre> 
     </course> 
     <course id="3" units="3" level="UNDERGRAD" name="Discrete Mathematics"> 
      <pre>1</pre> 
     </course> 
     <course id="4" units="3" level="UNDERGRAD" name="Data Structures"/> 
     <course id="5" units="3" level="UNDERGRAD" name="Database Systems"> 
      <pre>4</pre> 
      <pre>2</pre> 
     </course> 
     <course id="6" units="3" level="UNDERGRAD" name="Internet Engineering"> 
      <pre>4</pre> 
      <pre>2</pre> 
      <co>5</co> 
     </course> 
     <course id="7" units="3" level="GRAD" name="Formal Methods"/> 
     <course id="8" units="3" level="GRAD" name="Advanced Networks"/> 
     <course id="9" units="3" level="UNDERGRAD" name="Fundamentals of Management"/> 
     <course id="10" units="3" level="UNDERGRAD" name="Fundamentals of IT"/> 
     <course id="11" units="3" level="UNDERGRAD" name="Multimedia"/> 
     <course id="12" units="3" level="UNDERGRAD" name="Network Security"/> 
     <course id="13" units="3" level="UNDERGRAD" name="Elearning"/> 
    </courses> 
    <profs> 
     <prof firstName="Ramtin" id="1"/> 
     <prof firstName="Ahmad" id="2"/> 
     <prof firstName="Hesham" id="3"/> 
     <prof firstName="Fatemeh" id="4"/> 
     <prof firstName="Mahmood" id="5"/> 
     <prof firstName="Mahmoudreza" id="6"/> 
     <prof firstName="Fattaneh" id="7"/> 
     <prof firstName="Azadeh" id="8"/> 
     <prof firstName="Siamak" id="9"/> 
    </profs> 
    <terms> 
     <term id="1"> 
      <offering id="1" prof="6" course="1" section="1" time="1" capacity="10"/> 
      <offering id="2" prof="1" course="2" section="1" time="1" capacity="10"/> 
      <offering id="3" prof="9" course="3" section="1" time="2" capacity="10"/> 
      <offering id="4" prof="3" course="4" section="1" time="3" capacity="10"/> 
      <offering id="5" prof="1" course="7" section="1" time="6" capacity="10"/> 
     </term> 
     <term> 
      <offering id="6" prof="1" course="2" section="1" time="5" capacity="10"/> 
      <offering id="7" prof="9" course="3" section="1" time="6" capacity="10"/> 
      <offering id="8" prof="4" course="8" section="1" time="6" capacity="10"/> 
      <offering id="9" prof="2" course="1" section="1" time="1" capacity="10"/> 
     </term> 
    </terms> 
    <students> 
     <student firstName="Gholam" lastName="Patoobaf" program="1" id="810190420"> 
      <studyrec grade="9.0" offering="1" status="FAILED"/> 
      <studyrec grade="0.0" offering="9" status="INPROGRESS"/> 
     </student> 
     <student firstName="Ghamar" lastName="Aghrabparast" program="1" id="810190421"> 
      <studyrec grade="16.0" offering="1" status="PASSED"/> 
      <studyrec grade="0.0" offering="6" status="INPROGRESS"/> 
      <studyrec grade="0.0" offering="7" status="INPROGRESS"/> 
     </student> 
    </students> 
</dept> 

我对元素的java类:提供

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Offering { 
    @XmlAttribute 
    @XmlID 
    private String id; 
    @XmlAttribute 
    @XmlIDREF 
    private Prof prof; 
    @XmlAttribute 
    @XmlIDREF 
    private Course course; 
    @XmlAttribute 
    private String section; 
    @XmlAttribute 
    private String time; 
    @XmlAttribute 
    private int capacity; 

    public void setCapacity(int capacity) { 
     this.capacity = capacity; 
    } 

    public int getCapacity() { 
     return capacity; 
    } 

    public void setCourse(Course course) { 
     this.course = course; 
    } 

    public Course getCourse() { 
     return course; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setProf(Prof prof) { 
     this.prof = prof; 
    } 

    public Prof getProf() { 
     return prof; 
    } 

    public void setSection(String section) { 
     this.section = section; 
    } 

    public String getSection() { 
     return section; 
    } 

    public void setTime(String time) { 
     this.time = time; 
    } 

    public String getTime() { 
     return time; 
    }  

    @Override 
    public boolean equals(Object t) { 
     if (t instanceof Offering) { 
      if(((Offering)t).getId().equals(this.id)) { 
       return true; 
      } 
     } 
     return false; 
    } 

} 

的元素我的java类:教授

import javax.xml.bind.annotation.*; 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Prof { 
    @XmlAttribute 
    private String firstName; 
    @XmlAttribute 
    @XmlID 
    private String id; 

    public void setId(String id) { 
     this.id = id; 
    } 

    public void setFirstname(String firstname) { 
     this.firstName = firstname; 
    } 

    public String getFirstname() { 
     return firstName; 
    } 

    public String getId() { 
     return id; 
    } 

} 

所以,如果我只是加载和输入的文件保存到另一个文件 我惊人的看到这一点: 中提供的元素,其中教授ID是小于6,prog属性未显示,在java上下文中为null 但profid为6或更多的产品具有正确的prof属性

此事件也发生for course attri提供的弼但对于9,而不是6 你看我下面的输出的一部分:

... 
<offering id="1" prof="6" section="1" time="1" capacity="10"/> 
<offering id="2" section="1" time="1" capacity="10"/> 
<offering id="3" prof="9" section="1" time="2" capacity="10"/> 
<offering id="4" section="1" time="3" capacity="10"/> 
<offering id="5" section="1" time="6" capacity="10"/> 
... 

它例如JAXB没有规则正常运行此输入XML不只是ID大于6:

<offering id="1" prof="3" course="1" section="1" time="1" capacity="10"/> 
<offering id="2" prof="3" course="2" section="1" time="1" capacity="10"/> 
<offering id="3" prof="9" course="3" section="1" time="2" capacity="10"/> 
<offering id="4" prof="8" course="4" section="1" time="3" capacity="10"/> 
<offering id="5" prof="6" course="7" section="1" time="6" capacity="10"/> 
+0

确定解决问题,它有例如JAXB没有规则正常运行此: – abozar 2013-03-26 18:00:48

+0

下面是演示如何'@ XmlID'和'@ XmlIDREF'被设计成一起工作的例子:http://blog.bdoughan.com/2010/10/j AXB-和共享引用-xmlid-and.html – 2013-03-26 20:12:08

回答

2

我通过实施IDResolver