我在javabean属性之前加上 @XmlElement(name =“title”,required = true) int some_property ,并没有为 some_property 指定值。由于某种原因,生成的XML中不会出现此属性。所以,请解释必需
的含义代码的一些有意义的部分:
@XmlRootElement(name = "book")
@XmlType(propOrder = { "author", "name", "publisher", "isbn" })
public class Book {
private String name;
private String author;
private String publisher;
private String isbn;
// If you like the variable name, e.g. "name", you can easily change this
// name for your XML-Output:
@XmlElement(name = "title",required = true)
public String getName() {
return name;
}
....
主要:
中的某处 // create books
Book book1 = new Book();
book1.setIsbn("978-0060554736");
book1.setAuthor("Neil Strauss");
book1.setPublisher("Harpercollins");
bookList.add(book1);
Book book2 = new Book();
book2.setIsbn("978-3832180577");
book2.setName("Feuchtgebiete");
book2.setAuthor("Charlotte Roche");
book2.setPublisher("Dumont Buchverlag");
bookList.add(book2);
JAXBContext context = JAXBContext.newInstance(Bookstore.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Write to System.out
m.marshal(bookstore, System.out);
// Write to File
m.marshal(bookstore, new File(BOOKSTORE_XML));
// 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));
ArrayList<Book> list = bookstore2.getBooksList();
答案 0 :(得分:20)
required
@XmlElement
的内容
required
注释上的@XmlElement
属性会影响从Java类生成的XML模式。
域模型(根)
下面是一个简单的Java模型。请注意bar
属性如何required=true
而foo
属性没有。
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement
private String foo;
@XmlElement(required=true)
private String bar;
@XmlElement(nillable=true)
private String baz;
}
演示代码
下面是一些代码,演示了如何使用JAXBContext
生成XML架构。
import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
public class GenerateSchema {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
jc.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri,
String suggestedFileName) throws IOException {
StreamResult result = new StreamResult(System.out);
result.setSystemId(suggestedFileName);
return result;
}
});
}
}
生成的XML架构
下面是生成的XML架构,说明与foo
字段对应的XML元素如何minOccurs="0"
,而bar
字段对应的XML元素(用{{1}注释这是因为默认的@XmlElement(required=true)
是1,这意味着它是必需的。
minOccurs
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="root"/>
<xs:complexType name="root">
<xs:sequence>
<xs:element name="foo" type="xs:string" minOccurs="0"/>
<xs:element name="bar" type="xs:string"/>
<xs:element name="baz" type="xs:string" nillable="true" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
值的元素域模型(根)
null
字段已注明baz
。如果值为null,则生成的XML元素将利用@XmlElement(nillable=true)
属性。如果没有此注释,则空值将被视为缺少节点。
xsi:nil
演示代码
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement
private String foo;
@XmlElement(required=true)
private String bar;
@XmlElement(nillable=true)
private String baz;
}
<强>输出强>
以下是运行演示代码的结果XML。
import javax.xml.bind.*;
public class MarshalDemo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
答案 1 :(得分:1)
来自:http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlElement.html
需要公共抽象布尔
自定义要求的元素声明。 如果required()为true,则Javabean属性将映射到具有minOccurs =“1”的XML模式元素声明。对于单值属性,maxOccurs为“1”,对于多值属性,maxOccurs为“无界”。
如果required()为false,则使用minOccurs =“0”将Javabean属性映射到XML Schema元素声明。对于单值属性,maxOccurs为“1”,对于多值属性,maxOccurs为“无界”。
您的属性映射到(希望)在架构中声明为必需的元素。您生成的XML不符合该特定模式,这或多或少是我所期望的实例,而该实例并未按照规则“播放”
答案 2 :(得分:0)
您能告诉我们您的代码示例并生成xml吗? 根据文件:
如果required为true,则Javabean属性将映射到XML架构 minOccurs =“1”的元素声明。单个的maxOccurs为“1” 有价值的财产和多元财产的“无限制”。