jaxb生成空节点能创建节点一样的vo类吗

JAXB解析多层节点xml文件 -Java- TryCatch
>> Content
JAXB解析多层节点xml文件
如何将多层节点的&xml&文件转换成&Java&对象呢?XML&文件如下:&service&name="sms-1"&type="SMS"&&&topology&&role&name="fdb-PPSProxy"&type="cluster"&scaling="false"&&node&name="fdb-PPSProxy"&host="vm1"&&&software&name="PPSProxy"&/&&&software&name="fdb"&/&&&/node&&node&name="PPSProxy"&host="vm4"&&&software&name="PPSProxy"&/&&&software&name="fdb"&/&&&&/node&&/role&&role&name="FCC-UserProxy"&type="dual_machine"&scaling="false"&&node&name="FCC-UserProxy"&host="vm2"&&&software&name="Userproxy"&/&&&software&name="FCC"&/&&&/node&&node&name="FCC-UserProxy"&host="vm5"&&&software&name="Userproxy"&/&&&software&name="FCC"&/&&&&/node&&/role&&/topology&&/service&
------Solutions------
&xs:schema&xmlns:xs="http://www.w3.org/2001/XMLSchema"&&xs:element&name="topology"&&xs:complexType&&xs:sequence&&xs:element&ref="role"&maxOccurs="unbounded"/&&/xs:sequence&&/xs:complexType&&/xs:element&&xs:element&name="software"&&xs:complexType&&xs:attribute&name="name"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&/xs:complexType&&/xs:element&&xs:element&name="service"&&xs:complexType&&xs:sequence&&xs:element&ref="topology"/&&/xs:sequence&&xs:attribute&name="type"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&xs:attribute&name="name"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&/xs:complexType&&/xs:element&&xs:element&name="role"&&xs:complexType&&xs:sequence&&xs:element&ref="node"&maxOccurs="unbounded"/&&/xs:sequence&&xs:attribute&name="type"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&xs:attribute&name="scaling"&type="xs:boolean"&use="required"/&&xs:attribute&name="name"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&/xs:complexType&&/xs:element&&xs:element&name="node"&&xs:complexType&&xs:sequence&&xs:element&ref="software"&maxOccurs="unbounded"/&&/xs:sequence&&xs:attribute&name="name"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&xs:attribute&name="host"&use="required"&&xs:simpleType&&xs:restriction&base="xs:string"&&/xs:restriction&&/xs:simpleType&&/xs:attribute&&/xs:complexType&&/xs:element&&/xs:schema&用这个schema试试,生成java对象(建议用maven插件生成),JAXB跟多少层的xml文件没关系。2524人阅读
Java那些事(29)
   在我们的实际应用中,Xml中的结构往往不止这么简单,一般都会有2,3层。也就是说如果映射成对象就是聚合(组合)的情况 。
就用我们上一章的例子继续来讲,简单我们的Book的author现在不止是一个String类型的名子,他是一个对象Author,并包含作者的相关个人信息。那我们怎么做列?
直接看代码
package com.jaxb.
import javax.xml.bind.annotation.XmlAccessorT
import javax.xml.bind.annotation.XmlRootE
import javax.xml.bind.annotation.XmlT
@XmlRootElement(name = &book&)
// If you want you can define the order in which the fields are written
// Optional
@XmlType(propOrder = { &name&, &author&, &publisher&, &isbn& })
public class Book {
// If you like the variable name, e.g. &name&, you can easily change this
// name for your XML-Output:
public String getName() {
public void setName(String name) {
this.name =
public Author getAuthor() {
public void setAuthor(Author author) {
this.author =
public String getPublisher() {
public void setPublisher(String publisher) {
this.publisher =
public String getIsbn() {
public void setIsbn(String isbn) {
this.isbn =
package com.jaxb.
import javax.xml.bind.annotation.XmlA
public class Author {
@XmlAttribute
public String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
package com.jaxb.
import java.util.ArrayL
import javax.xml.bind.annotation.XmlE
import javax.xml.bind.annotation.XmlElementW
import javax.xml.bind.annotation.XmlRootE
@XmlRootElement(namespace=&abc&)
public class Bookstore {
// XmLElementWrapper generates a wrapper element around XML representation
@XmlElementWrapper(name = &bookList&)
// XmlElement sets the name of the entities
@XmlElement(name = &book&)
private ArrayList&Book& bookL
public void setBookList(ArrayList&Book& bookList) {
this.bookList = bookL
public ArrayList&Book& getBooksList() {
return bookL
public String getName() {
public void setName(String name) {
this.name =
public String getLocation() {
public void setLocation(String location) {
this.location =
package com.jaxb.
import java.io.FileR
import java.io.FileW
import java.io.IOE
import java.io.W
import java.util.ArrayL
import javax.xml.bind.JAXBC
import javax.xml.bind.JAXBE
import javax.xml.bind.M
import javax.xml.bind.U
import com.sun.xml.bind.marshaller.NamespacePrefixM
public class BookMain {
private static final String BOOKSTORE_XML = &./bookstore-jaxb.xml&;
public static void main(String[] args) throws JAXBException, IOException {
ArrayList&Book& bookList = new ArrayList&Book&();
// create books
Book book1 = new Book();
book1.setIsbn(&978-&);
book1.setName(&The Game&);
Author a = new Author();
a.setAge(28);
a.setName(&Gosling&);
book1.setAuthor(a);
book1.setPublisher(&Harpercollins&);
bookList.add(book1);
Book book2 = new Book();
book2.setIsbn(&978-&);
book2.setName(&Feuchtgebiete&);
Author a2 = new Author();
a2.setAge(32);
a2.setName(&James Green&);
book2.setAuthor(a2);
book2.setPublisher(&Dumont Buchverlag&);
bookList.add(book2);
// create bookstore, assigning book
Bookstore bookstore = new Bookstore();
bookstore.setName(&Fraport Bookstore&);
bookstore.setLocation(&Frankfurt Airport&);
bookstore.setBookList(bookList);
// create JAXB context and instantiate marshaller
JAXBContext context = JAXBContext.newInstance(Bookstore.class);
Marshaller m = context.createMarshaller();
NamespacePrefixMapper mapper = new PreferredMapper();
m.setProperty(&com.sun.xml.bind.namespacePrefixMapper&, mapper);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(bookstore, System.out);
Writer w =
w = new FileWriter(BOOKSTORE_XML);
m.marshal(bookstore, w);
} finally {
w.close();
} catch (Exception e) {
// get variables from our xml file, created before
System.out.println();
System.out.println(&Output from our XML File: &);
Unmarshaller um = context.createUnmarshaller();
Bookstore bookstore2 = (Bookstore) um.unmarshal(new FileReader(
BOOKSTORE_XML));
for (int i = 0; i & bookstore2.getBooksList().toArray(). i++) {
System.out.println(&Book & + (i + 1) + &: &
+ bookstore2.getBooksList().get(i).getName() + & from &
+ bookstore2.getBooksList().get(i).getAuthor());
public static class PreferredMapper extends NamespacePrefixMapper {
public String getPreferredPrefix(String namespaceUri,
String suggestion, boolean requirePrefix) {
return &pre&;
看下输出结果:
& &?xml version=&1.0& encoding=&UTF-8& standalone=&yes&?&
&pre:bookstore xmlns:pre=&abc&&
&bookList&
&name&The Game&/name&
&author name=&Gosling&&
&age&28&/age&
&publisher&Harpercollins&/publisher&
&isbn&978-&/isbn&
&name&Feuchtgebiete&/name&
&author name=&James Green&&
&age&32&/age&
&publisher&Dumont Buchverlag&/publisher&
&isbn&978-&/isbn&
&/bookList&
&location&Frankfurt Airport&/location&
&name&Fraport Bookstore&/name&
&/pre:bookstore&
Output from our XML File:
Book 1: The Game from com.jaxb.first.Author@1774b9b
Book 2: Feuchtgebiete from com.jaxb.first.Author@104c575
OK 是我们想要的格式吧。 那么事情就解决了
&& 值 得注意的是:如果你要对属性做注解,必须将注解写在属性的get方法上, 就如我们Author类中的 @XmlAttribute那样,否则运行的时候他会提示:the same element name xxx..
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:429949次
积分:5432
积分:5432
排名:第4061名
原创:111篇
转载:11篇
评论:278条
文章:13篇
阅读:105636
(1)(8)(1)(1)(2)(1)(6)(2)(2)(2)(7)(4)(1)(1)(2)(1)(2)(3)(15)(1)(10)(6)(2)(2)(4)(12)(1)(1)(3)(2)(3)(1)(8)(4)本帖子已过去太久远了,不再提供回复功能。JAXB的实例分析 - 推酷
JAXB的实例分析
预计阅读时间: 11 分钟
这次,我要做的是一个人拥有多本书的JAXB小例子。我在Person.main()里面把整个实例的实验结果输出。
JDK中JAXB相关的重要Annotation:
,将Java类或枚举类型映射到XML模式类型
) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
,控制JAXB 绑定类中属性和字段的排序。
,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
,将Java类或枚举类型映射到XML元素。
,将Java类的一个属性映射到与属性同名的一个XML元素。
,将Java类的一个属性映射到与属性同名的一个XML属性。
BookVO类(书的实体类)
* Created by pengguangyu on .
* JAXB注解实体类
@XmlRootElement(name = &Book&)
public class BookVO implements Serializable {
private long bookId;
private String bookN
public long getBookId() {
return bookId;
public void setBookId(long bucketId) {
this.bookId = bookId;
public String getBookName() {
return bookN
public void setBookName(String bookName) {
this.bookName = bookN
public String getAuthor() {
public void setAuthor(String author) {
this.author =
Person类(人的实体类)
* Created by pengguangyu on .
* JAXB注解实体类
@XmlRootElement(name=&Person&)
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElementWrapper(name=&Books&)
@XmlElement(name = &book&)
private List&BookVO&
public String getName() {
public void setName(String name) {
this.name =
public String getSex() {
public void setSex(String sex) {
this.sex =
public void setPersons(List&BookVO& persons) {
this.persons =
public List&BookVO& getPersons() {
public static void main(String[] args){
StringWriter writer = new StringWriter();
Person person = new Person();
person.setName(&pgy&);
person.setSex(&boy&);
List&BookVO& BookList = new ArrayList&BookVO&();
BookVO bookVO = new BookVO();
bookVO.setAuthor(&pgy&);
bookVO.setBookName(&haha&);
BookList.add(bookVO);
BookList.add(bookVO);
person.setPersons(BookList);
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshal = context.createMarshaller();
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化输出
marshal.setProperty(Marshaller.JAXB_ENCODING, &UTF-8&);// 编码格式,默认为utf-8
marshal.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头信息
marshal.setProperty(&jaxb.encoding&, &utf-8&);
marshal.marshal(person,writer);
String output = new String(writer.getBuffer());
System.out.println(&output:&+output);
} catch (JAXBException e) {
e.printStackTrace();
实验结果:
output:&?xml version=&1.0& encoding=&utf-8& standalone=&yes&?&
&name&pgy&/name&
&sex&boy&/sex&
&author&pgy&/author&
&bookId&0&/bookId&
&bookName&haha&/bookName&
&author&pgy&/author&
&bookId&0&/bookId&
&bookName&haha&/bookName&
上述完成了JAXB实现String和List两种结构的处理。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 jaxb根节点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信