所以这是一个复杂/迟钝的情况。我正在编写XSD,并且恰好需要2个根元素(在任何给定时间为1)
<xs:element name="booksList">
<xs:complexType>
<xs:sequence>
<xs:element name="book" type="bookType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
然后
<xs:element name="book" type="bookType"></xs:element>
在任何给定时间,这些元素中的任何一个都将用作根元素,因此XML看起来像
<bookList>
<book>
<author>XYZ</author>
</book>
</bookList>
或
<book>
<author>XYZ</author>
</book>
这两个XML都将从2个不同的URL发回给用户,即列表将从 localhost / books.xml?author = XYZ 发送,单个书将从本地主机/ book_name.xml
如何使用一个xml实现这一目标?我尝试将书定义放在XSD中,但JAXB2.1没有生成任何Book类。有什么我想念的吗?
EDIT1 :已生成BookType但BookType没有任何根元素。
答案 0 :(得分:10)
XML SCHEMA
我正在写一个XSD,并且恰好需要我需要的地方 2个根元素(在任何给定时间为1)
下面的XML架构支持您正在寻找的两个根元素booksList
和book
。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="booksList">
<xs:complexType>
<xs:sequence>
<xs:element name="book" type="bookType" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book" type="bookType"></xs:element>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="author" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
生成模型
我尝试将书籍定义放在XSD中,但JAXB2.1却没有 生成任何Book类。
您的JAXB(JSR-222)实现将为命名的复杂类型bookType
生成一个类,然后对于bookElement
,它将在@XmlElementDecl
上创建ObjectFactory
注释} class。
的 BooksList 强> 的
在此类上生成了一个@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<BookType> book;
public List<BookType> getBook() {
if (book == null) {
book = new ArrayList<BookType>();
}
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 强> 的
与命名复杂类型对应的全局元素在@XmlElementDecl
类上生成ObjectFactory
注释。这是必要的,因为多个全局元素可以对应于命名的复杂类型。
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<BookType> createBook(BookType value) {
return new JAXBElement<BookType>(_Book_QNAME, BookType.class, null, value);
}
}
<强> XML 强>
以下是您提问的XML文档。
的 booksList.xml 强> 的
<booksList>
<book>
<author>XYZ</author>
</book>
</booksList>
的是book.xml 强> 的
<book>
<author>XYZ</author>
</book>
DEMO CODE
当您解组根元素对应于@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<BookType> je = (JAXBElement<BookType>) unmarshaller.unmarshal(input2);
BookType bookType = je.getValue();
}
}
<强>更新强>
下面是一个代码片段,演示如何在BookType
中包装JAXBElement
的实例,以便对其进行编组。
ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<BookType> jaxbElement = objectFactory.createBook(aBookType);
marshaller.marshal(jaxbElement, System.out);
答案 1 :(得分:4)
见previous question。您可以执行等效的&lt; xs:choice /&gt;在根元素上简单地按顺序列出可能性,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookList">
<xs:complexType>
<xs:sequence>
<xs:element name="book" type="bookType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book" type="bookType"/>
<!-- ... -->
</xs:schema>