目标:正确编组和解组clin.xml
问题:读出物理治疗师(在诊所工作的人)的身份
这是 clinic.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<clinic clinicNumber="1">
<name>ClinicStackOverFlow</name>
<address>Deadbrains</address>
<zipCode>SomeZip</zipCode>
<city>City</city>
<phoneNumber>069441341341</phoneNumber>
<!-- LIST OF THE ID's of physiotherapists that work here -->
<physiotherapists>1</physiotherapists>
<physiotherapists>2</physiotherapists>
</clinic>
Clinic.java
package fysio.shared.domain;
import com.sun.deploy.xml.XMLable;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Clinic {
/**
* The identifier of a clinic
*/
@XmlID
@XmlAttribute
@XmlJavaTypeAdapter(IDStringAdapter.class)
private String clinicNumber;
/**
* The name of a clinic
*/
private String name;
/**
* The address where the clinic is located
*/
private String address;
/**
* The zip code of a clinic
*/
private String zipCode;
/**
* The city a clinic is located in
*/
private String city;
/**
* The phone number of a clinic
*/
private String phoneNumber;
@XmlIDREF
private List<Physiotherapist> physiotherapists;
/**
* The default constructor for Jaxb
*/
public Clinic() {
}
public Clinic(String clinicNumber, String name, String address, String zipCode, String city, String phoneNumber, List<Physiotherapist> physiotherapists) {
this.clinicNumber = clinicNumber;
this.name = name;
this.address = address;
this.zipCode = zipCode;
this.city = city;
this.phoneNumber = phoneNumber;
this.physiotherapists = physiotherapists;
}
/**
* Returns the number of a clinic
*
* @return The number of a clinic
*/
public String getClinicNumber() {
return clinicNumber;
}
/**
* Sets the number of a clinic
*
* @param clinicNumber the number of a clinic
*/
public void setClinicNumber(String clinicNumber) {
this.clinicNumber = clinicNumber;
}
public List<Physiotherapist> getPhysiotherapists() {
return physiotherapists;
}
/**
* Sets the physiotherapists of a clinic
*
* @param physiotherapists The Physiotherapists of a clinic
*/
public void setPhysiotherapists(List<Physiotherapist> physiotherapists) {
this.physiotherapists = physiotherapists;
}
/**
* adds a physiotherapist to a clinic
*
* @param physiotherapist The physiotherapist that needs to be added to a clinic
*/
public void addPhysiotherapist(Physiotherapist physiotherapist) {
physiotherapists.add(physiotherapist);
}
}
我们有物理治疗师名单(以xml为单位)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<physiotherapists>
<physiotherapist physiotherapistNumber="1">
<clinic>1</clinic>
<name>Henk</name>
</physiotherapist>
<physiotherapist physiotherapistNumber="2">
<clinic>8</clinic>
<name>Klaas</name>
</physiotherapist>
</physiotherapists>
Physiotherapist.java(单数)
package fysio.shared.domain;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Physiotherapist {
@XmlAttribute
@XmlID
private String physiotherapistNumber;
@XmlIDREF
private Clinic clinic;
private String name;
public Physiotherapist() {
//Default empty constructor for JAXB
}
public Physiotherapist(String name, Clinic clinic) {
this.clinic = clinic;
this.name = name;
}
public Clinic getClinic() {
return clinic;
}
public String getPhysiotherapistNumber() {
return physiotherapistNumber;
}
public void setPhysiotherapistNumber(String physiotherapistNumber) {
this.physiotherapistNumber = physiotherapistNumber;
{}
}
Physiotherapists.java(复数)
@XmlRootElement(name = "physiotherapists")
@XmlAccessorType(XmlAccessType.FIELD)
public class Physiotherapists {
@XmlElement(name = "physiotherapist")
private List<Physiotherapist> physiotherapistList;
public Physiotherapists() {
//empty constructor for xml parsing
physiotherapistList = new ArrayList<Physiotherapist>();
}
public List<Physiotherapist> getPhysiotherapistList() {
return physiotherapistList;
}
}
最后是解组部分:
try {
JAXBContext jc = JAXBContext.newInstance(Clinic.class, Physiotherapist.class, Physiotherapists.class);
File clinicXML = new File("src/test/resources/data/xml/clinic.data");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Clinic clinicXMLData = (Clinic) unmarshaller.unmarshal(clinicXML);
File fysiotherapistXML = new File("src/test/resources/data/xml/physiotherapist.data");
Unmarshaller unmarshaller2 = jc.createUnmarshaller();
Physiotherapists ph = (Physiotherapists) unmarshaller2.unmarshal(fysiotherapistXML);
} catch (JAXBException e) {
e.printStackTrace();
}
两个解散者都尽力而为。我从unmarshaller 2获得了很好的物理治疗师名单,但我从诊所unmarshaller那里得到的物理治疗师没有得到任何信息:
http://imgur.com/Mpcgm8t(堆栈没有让我上传照片)
我有点失去它......不知道什么是错的和正确的。在网上尝试了很多解决方案,了解它们中的大部分,但仍然遗漏了一些东西。
(这是一个学校项目,但还没有重构)
答案 0 :(得分:1)
当解组PT列表与那些Clinic对象没有任何关联时,如何才能将物理治疗师(PT)引用引入Clinic对象?诊所是根据XML数据构建的,其中没有PT,期间。
要使XmlID和XmlIDREF正常工作,即在对带注释的XmlIDREF字段中存储对象引用,必须有一个合适类型的对象,并且在同一XML文件中的XmlID字段中具有匹配值。
您必须将XML数据合并到一个文件中。
看到您从诊所引用诊所和诊所的PT,我担心即使在那时您也会遇到一个方面的困难。 (我可能错了 - 自从我尝试这个以来已经太久了。)
现在我认为您可能不想合并XML文件。为了解决您的困境,我建议您删除ID和IDREF注释并“手动”设置链接。单次通过PT列表就足够了,这是一个简单而强大的解决方案。