XSD有2个根元素(一次1个)
所以这是一个复杂/迟钝的情况。 我正在编写XSD,并且恰好需要2个根元素(在任何给定时间为1)
接着
在任何给定的时间,这些元素中的任何一个都将用作根元素,因此XML看起来就像
XYZ
要么
XYZ
这两个XML都将从2个不同的URL发送回用户,即列表将从localhost / books.xml发送?author = XYZ ,单个book将从localhost / book_name.xml发送
我怎么能用一个xml来实现这个目标? 我尝试将书籍定义放在XSD中,但JAXB2.1没有生成任何Book类。 有什么东西我错过了吗?
EDIT1 :已生成BookType但BookType没有任何根元素。
XML SCHEMA
我正在编写XSD,并且恰好需要2个根元素(在任何给定时间为1)
下面的XML模式支持将两个根元素booksList
和book
正在寻找。
生成模型
我尝试将书籍定义放在XSD中,但JAXB2.1没有生成任何Book类。
您的JAXB(JSR-222)实现将为指定的复杂类型bookType
生成一个类,然后对于bookElement
,它将在ObjectFactory
类上创建一个@XmlElementDecl
注释。
BooksList
在@XmlRootElement
上生成了具有@XmlRootElement
类,因为它对应于具有匿名复杂类型的全局元素。
package forum11620825; import java.util.*; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"book"}) @XmlRootElement(name = "booksList") public class BooksList { protected List book; public List getBook() { if (book == null) { book = new ArrayList (); } return this.book; } }
的BookType
生成此类以对应于指定的复杂类型。
package forum11620825; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "bookType", propOrder = {"author"}) public class BookType { @XmlElement(required = true) protected String author; public String getAuthor() { return author; } public void setAuthor(String value) { this.author = value; } }
的ObjectFactory
与命名复杂类型对应的全局元素在ObjectFactory
类上生成@XmlElementDecl
注释。 这是必要的,因为多个全局元素可以对应于命名的复杂类型。
package forum11620825; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; @XmlRegistry public class ObjectFactory { private final static QName _Book_QNAME = new QName("", "book"); public ObjectFactory() { } public BooksList createBooksList() { return new BooksList(); } public BookType createBookType() { return new BookType(); } @XmlElementDecl(namespace = "", name = "book") public JAXBElement createBook(BookType value) { return new JAXBElement (_Book_QNAME, BookType.class, null, value); } }
XML
以下是您问题中的XML文档。
booksList.xml
XYZ
是book.xml
XYZ
演示代码
当您解组其中根元素对应于@XmlRootElement
批注的文档时,您将获得相应域对象的实例。 如果您解组其中根元素对应于@XmlElementDecl
批注的文档,则会返回一个JAXBElement
实例,该实例包装对应于指定复杂类型的域对象。
package forum11620825; import java.io.File; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance("forum11620825"); Unmarshaller unmarshaller = jc.createUnmarshaller(); File input1 = new File("src/forum11620825/booksList.xml"); BooksList bookList = (BooksList) unmarshaller.unmarshal(input1); File input2 = new File("src/forum11620825/book.xml"); JAXBElement je = (JAXBElement ) unmarshaller.unmarshal(input2); BookType bookType = je.getValue(); } }
UPDATE
下面是一个代码片段,演示如何在JAXBElement
包装BookType
实例,以便可以对其进行编组。
ObjectFactory objectFactory = new ObjectFactory(); JAXBElement jaxbElement = objectFactory.createBook(aBookType); marshaller.marshal(jaxbElement, System.out);
看到上一个问题 。 您可以在根元素上执行等效的