首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jaxb从java对象创建xml

如何使用jaxb从java对象创建xml
EN

Stack Overflow用户
提问于 2014-03-27 18:50:10
回答 2查看 320关注 0票数 1

如何使用jaxb在java中创建以下类型的xml

代码语言:javascript
复制
<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类是..

代码语言:javascript
复制
@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

和异常

代码语言:javascript
复制
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列表类??

EN

回答 2

Stack Overflow用户

发布于 2014-03-27 19:14:28

好的,听你说:

让一个类将MyInfo调用为:

代码语言:javascript
复制
@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的类编写为:

代码语言:javascript
复制
 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)将其标记为:

代码语言:javascript
复制
 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输出,您也可以将其写入文件中。输出将是:

代码语言:javascript
复制
<myInfo>
 <firstName>Shekhar</firstName>
<lastName>Khairnar</lastName>
<contactList>
    <id>1</id>
    <name>first</name>
</contactList>
<contactList>
    <id>2</id>
    <name>second</name>
</contactList>

票数 0
EN

Stack Overflow用户

发布于 2014-03-27 20:24:51

您可以执行以下操作:

代码语言:javascript
复制
@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表示与默认值不同的位置。
  • 默认情况下将公共字段和属性视为映射字段。如果只希望将字段视为已映射字段,则应指定映射字段可为private.
  • @XmlElementWrapper用于向collection.
  • When添加分组元素@XmlElement用于应用于集合中的每一项的集合上。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22685343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档