我试图编组多个对象,例如Book
添加到BookLists
via中setBookslst()
。我开始使用此JAXBContext
设置:
jaxbContext = JAXBContext.newInstance(BookLists.class);
和
jaxbMarshaller.marshal(lists, result);
但是,我得到了以下运行时例外:
javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的]
我的类型定义如下。
书:-
@XmlRootElement(name="book")
public class Book {
private String title;
private int year;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
图书清单:-
@XmlRootElement(name="lists")
public class BookLists {
List<Book> bookslst;
public List getBookslst() {
return bookslst;
}
public void setBookslst(List bookslst) {
this.bookslst = bookslst;
}
}
马歇尔代码:-
Book book;
BookLists lists=new BookLists();
List lst=new ArrayList();
book = new Book();
book.setTitle("Book title");
book.setYear(2010);
lst.add(book);
book = new Book();
book.setTitle("Book title1");
book.setYear(2011);
lst.add(book);
lists.setBookslst(lst);
JAXBContext jaxbContext;
try {
jaxbContext = JAXBContext.newInstance(BookLists.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter result = new StringWriter();
jaxbMarshaller.marshal(lists, result);
String xml = result.toString();
System.out.println(xml);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我正在尝试放置@XMLSeeAlso
注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中不可用。
默认情况下,JAXB(JSR-222)实现检查公共访问器方法。您可以在get / set方法中将Book
参数添加到List
。
public List<Book> getBookslst() {
return bookslst;
}
public void setBookslst(List<Book> bookslst) {
this.bookslst = bookslst;
}
或者,您可以使用@XmlElement
注释指定属性的类型:
@XmlElement(type=Book.class)
public List getBookslst() {
return bookslst;
}
您还可以指定JAXB实现对字段而不是属性进行内部检查:
@XmlRootElement(name="lists")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookLists {
List<Book> bookslst;
}
更新
在Marshallar.Marshall中,有没有其他方法可以添加List而不是BookList?
您可以创建一个利用@XmlAnyElement(lax=true)
注释的通用List包装器对象(请参阅:http : //blog.bdoughan.com/2010/08/using-
xmlanyelement-to-build-generic.html
)。然后它冷处理List
任何带有注释的内容@XmlRootElement
。
清单
package forum12323397;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Lists<VALUE> {
private List<VALUE> values = new ArrayList<VALUE>();
@XmlAnyElement(lax=true)
public List<VALUE> getValues() {
return values;
}
}
演示版
package forum12323397;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Lists.class, Book.class);
Lists<Book> lists = new Lists<Book>();
Book book1 = new Book();
book1.setTitle("A Book");
book1.setYear(2001);
lists.getValues().add(book1);
Book book2 = new Book();
book2.setTitle("Another Book");
book2.setYear(2007);
lists.getValues().add(book2);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(lists, System.out);
}
}
输出量
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<lists>
<book>
<title>A Book</title>
<year>2001</year>
</book>
<book>
<title>Another Book</title>
<year>2007</year>
</book>
</lists>
我正在构建一系列链接类,我希望这些类的实例能够整理成XML,这样我就可以将它们保存到一个文件中,以后再读进去。 目前我使用以下代码作为测试用例: XML输出为: 元素为空有什么原因吗?我希望它包含日期的字符串表示(即)。为了做到这一点,我需要编写一些我自己的代码吗? 的输出是:
我想让JAXB列表到xml,其中命名空间只出现在根元素中,而不是在任何其他元素中: 我已经尝试了package level @XmlSchema,但是我一定是做错了什么,因为没有显示任何东西。 这是我的根元素类: 我还有以下包-info.java:
我正在尝试使用JAXB进行封送处理。 我的输出是这样的: ...但我需要这样的输出: 如果取消对代码的注释,则会得到。没有它,我可以编译,但我不能得到所需的精确输出。 我的豆子长这样: 适配器类
基本上,我要做的是创建一个封送器,它可以接收我给它的任何类对象,例如,car对象或person对象,并且它必须返回一个XML字符串。 警告:发生了非法的反射访问操作
我有这些课程: 用户 地址 输出 我如何解决这个问题?我是否可以使用一些JAXB注释?怎么做?还是需要创建某种类型的XmlAdapter?(我试过这个,但没有成功……)
问题内容: 有没有一种方法可以指定JAXB在XML模式中用于编组/解编对象的适配器? 例如,如果我想将以下内容解析为整数: 我可以在架构中使用以下内容: 当我通过XJC工具运行模式时,应使用Integer.decode()作为值为0x1234的Integer或十进制4660来解码字符串“ 0x1234”。生成的Adapter类正确反映了这一点: 但是,当我想将值编组回XML元素(这是String文