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模式支持将两个根元素booksListbook正在寻找。

                 

生成模型

我尝试将书籍定义放在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); 

看到上一个问题 。 您可以在根元素上执行等效的,只需按顺序列出可能性,如下所示: