以下是需要输出的XML文本格式
<Books> <Book> <name>书名A</name> <author>作者A</author> <price>作者A</price> </Book> <Book> <name>书名B</name> <author>作者B</author> <price>作者B</price> </Book> </Books>
生成的XSD文件格式如下
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="Books"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="Book"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Book"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="author"/> <xs:element ref="price"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="name" type="xs:NCName"/> <xs:element name="author" type="xs:NCName"/> <xs:element name="price" type="xs:NCName"/> </xs:schema>
xjc a.xsd parsing a schema... compiling a schema... generated\Book.java generated\Books.java generated\ObjectFactory.java
package generated; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element ref="{}Book" maxOccurs="unbounded"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "book" }) @XmlRootElement(name = "Books") public class Books { @XmlElement(name = "Book", required = true) protected List<Book> book; /** * Gets the value of the book property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the book property. * * <p> * For example, to add a new item, do as follows: * <pre> * getBook().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link Book } * * */ public List<Book> getBook() { if (book == null) { book = new ArrayList<Book>(); } return this.book; } }
package generated; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element ref="{}name"/> * <element ref="{}author"/> * <element ref="{}price"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "name", "author", "price" }) @XmlRootElement(name = "Book") public class Book { @XmlElement(required = true) @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "NCName") protected String name; @XmlElement(required = true) @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "NCName") protected String author; @XmlElement(required = true) @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "NCName") protected String price; /** * Gets the value of the name property. * * @return * possible object is * {@link String } * */ public String getName() { return name; } /** * Sets the value of the name property. * * @param value * allowed object is * {@link String } * */ public void setName(String value) { this.name = value; } /** * Gets the value of the author property. * * @return * possible object is * {@link String } * */ public String getAuthor() { return author; } /** * Sets the value of the author property. * * @param value * allowed object is * {@link String } * */ public void setAuthor(String value) { this.author = value; } /** * Gets the value of the price property. * * @return * possible object is * {@link String } * */ public String getPrice() { return price; } /** * Sets the value of the price property. * * @param value * allowed object is * {@link String } * */ public void setPrice(String value) { this.price = value; } }
package generated; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import javax.xml.namespace.QName; /** * This object contains factory methods for each * Java content interface and Java element interface * generated in the generated package. * <p>An ObjectFactory allows you to programatically * construct new instances of the Java representation * for XML content. The Java representation of XML * content can consist of schema derived interfaces * and classes representing the binding of schema * type definitions, element declarations and model * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { private final static QName _Author_QNAME = new QName("", "author"); private final static QName _Price_QNAME = new QName("", "price"); private final static QName _Name_QNAME = new QName("", "name"); /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: generated * */ public ObjectFactory() { } /** * Create an instance of {@link Book } * */ public Book createBook() { return new Book(); } /** * Create an instance of {@link Books } * */ public Books createBooks() { return new Books(); } /** * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} * */ @XmlElementDecl(namespace = "", name = "author") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) public JAXBElement<String> createAuthor(String value) { return new JAXBElement<String>(_Author_QNAME, String.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} * */ @XmlElementDecl(namespace = "", name = "price") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) public JAXBElement<String> createPrice(String value) { return new JAXBElement<String>(_Price_QNAME, String.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} * */ @XmlElementDecl(namespace = "", name = "name") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) public JAXBElement<String> createName(String value) { return new JAXBElement<String>(_Name_QNAME, String.class, null, value); } }
package generated; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.xml.bind.JAXB; public class Test { public static void main(String[] args) throws FileNotFoundException { marshal(new FileOutputStream("out.xml")); unmarshal(new FileReader("out.xml")); } private static void unmarshal(FileReader reader) { try { Books books = JAXB.unmarshal(reader, Books.class); System.out.println(books.getBook().size()); System.out.println(books.getBook().get(0).getName()); System.out.println(books.getBook().get(0).getAuthor()); System.out.println(books.getBook().get(0).getPrice()); } finally { try { reader.close(); } catch (IOException e) { } } } private static void marshal(OutputStream output) { ObjectFactory factory = new ObjectFactory(); Books books = factory.createBooks(); List<Book> bookList = books.getBook(); Book book = factory.createBook(); book.setName("书名A"); book.setAuthor("作者A"); book.setPrice("价格A"); bookList.add(book); book = factory.createBook(); book.setName("书名B"); book.setAuthor("作者B"); book.setPrice("价格B"); bookList.add(book); book = factory.createBook(); book.setName("书名C"); book.setAuthor("作者C"); book.setPrice("价格C"); bookList.add(book); try { JAXB.marshal(books, output); } finally { try { output.close(); } catch (IOException e) { } } } }