簡體   English   中英

如何使用jaxb從Java對象創建xml

[英]how create xml from java object using jaxb

我如何使用Jaxb在Java中創建以下類型的xml

<myInfo>
 <firstName>MyfirstName</firstName>
 <lastName>MyLstNme</lastName>
 <contactList>
  <contact>
   <id>001</id>
   <name>name1</name>
  <contact/>
  <contact>
   <id>002</id>
   <name>name2</name>
  <contact/>
  <contact>
   <id>003</id>
   <name>name3</name>
  <contact/>
 </ContactList>
</myInfo>

Bean類是..

@XmlRootElement(name = "myInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyInfo {
    @XmlElement(name = "firstName")
    public String firstName;

    @XmlElement(name = "lastName")
    public String lastName;

    @XmlElement(name = "contactList")
    public ContactList contactList;
   ...getter setter
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "contactList")
public class ContactList {
    @XmlElement(name = "contact", type = Contact.class)
    public List<Contact> list = new ArrayList<Contact>();

    public ContactList() {
    }

    public ContactList(List<Contact> list) {
        this.list = list;
    }

   ...getter setter
}

@XmlRootElement(name = "Contact")
public class Contact {

    @XmlElement(name = "id")
    public String id;

    @XmlElement(name = "name")
    public String name;

   ...getter setter

和例外

objData ToXML 2 counts of IllegalAnnotationExceptions
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
==
Class has two properties of the same name "id"
    this problem is related to the following location:
        at public java.lang.String java8javafx8.Contact.getId()
        at java8javafx8.Contact
        at public java.util.List java8javafx8.ContactList.list
        at java8javafx8.ContactList
        at public java8javafx8.ContactList java8javafx8.MyInfo.contactList
        at java8javafx8.MyInfo
    this problem is related to the following location:
        at public java.lang.String java8javafx8.Contact.id
        at java8javafx8.Contact
        at public java.util.List java8javafx8.ContactList.list
        at java8javafx8.ContactList
        at public java8javafx8.ContactList java8javafx8.MyInfo.contactList
        at java8javafx8.MyInfo
Class has two properties of the same name "name"
    this problem is related to the following location:
        at public java.lang.String java8javafx8.Contact.getName()
        at java8javafx8.Contact
        at public java.util.List java8javafx8.ContactList.list
        at java8javafx8.ContactList
        at public java8javafx8.ContactList java8javafx8.MyInfo.contactList
        at java8javafx8.MyInfo
    this problem is related to the following location:
        at public java.lang.String java8javafx8.Contact.name
        at java8javafx8.Contact
        at public java.util.List java8javafx8.ContactList.list
        at java8javafx8.ContactList
        at public java8javafx8.ContactList java8javafx8.MyInfo.contactList
        at java8javafx8.MyInfo

如何創建Bean類和Bean列表類?

好吧,你走了:

使一個類調用MyInfo為:

@XmlRootElement(name="myInfo")
public class MyInfo {

private String firstName;
private String lastName;
private List<Contact> contactList = new ArrayList<Contact>(0);


public MyInfo(){}

public MyInfo(String fName, String lName){
    this.firstName = fName;
    this.lastName = lName;
}

@XmlElement(name = "firstName")
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@XmlElement(name="lastName")
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
public List<Contact> getContactList() {
    return contactList;
}

@XmlElement(name = "contactList")
public void setContactList(List<Contact> contactList) {
    this.contactList = contactList;
}
 }

將另一個名為Contact的類編寫為:

 public class Contact {

private int id;
private String name;

public Contact(){}

public Contact(int id, String name){
    this.id = id;
    this.name = name;
}

@XmlElement(name = "id")
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}

@XmlElement(name = "name")
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}

使用JAXB(創建XML)將其編組為:

 public class Test  {

public static void main(String[] args){
    Contact c1 = new Contact(1, "first");
    Contact c2 = new Contact(2, "second");

    MyInfo info = new MyInfo("Shekhar", "Khairnar");
    info.getContactList().add(c1);
    info.getContactList().add(c2);

    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(MyInfo.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(info, System.out);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

在上面例如。 我只是在控制台上打印xml輸出,您也可以將其寫入文件中。 輸出將是:

<myInfo>
 <firstName>Shekhar</firstName>
<lastName>Khairnar</lastName>
<contactList>
    <id>1</id>
    <name>first</name>
</contactList>
<contactList>
    <id>2</id>
    <name>second</name>
</contactList>

您可以執行以下操作:

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

   private String firstName;
   private String lastName;

   @XmlElementWrapper
   @XmlElement(name="contact")
   private List<Contact> contactList;

   // getters & setters

}

注意事項:

  • JAXB是例外配置,因此您只需注釋要XML表示形式與默認設置不同的位置。
  • 默認情況下,JAXB將公共字段和屬性視為已映射。 如果只想將字段視為映射,則應指定@XmlAccessorType(XmlAccessType.FIELD)
  • 映射的字段可以是私有的。
  • @XmlElementWrapper用於將分組元素添加到集合中。
  • 在集合上使用@XmlElement它將應用於集合中的每個項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM