将DOM节点添加为任何对象到JAXB类

时间:2017-03-22 01:02:58

标签: java xml jaxb

我有一个包含任何元素的jaxb类:

@XmlAnyElement(lax = true)
protected List<Object> any;

我想以编程方式向其添加DOM节点,然后将其编组为XML。基本上,我尝试过创建一个节点,然后将其添加到任何列表中:

QName qn = new QName(...);
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
doc = f.newDocumentBuilder().newDocument();
Node node = doc.createElementNS(qn.getNamespaceURI(), qn.getLocalPart());
myJaxbClass.getAny().add(node); 

然后我做了marhsalling:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
// Marshal the Object to a Document
JAXBContext jc2 = JAXBContext.newInstance(BookEntry.class);
Marshaller marshaller = jc2.createMarshaller();
marshaller.marshal(book, document);

将整个Jaxb类编组回xml失败,但出现异常:

  

com.sun.istack.SAXException2:无法封装类型“MyApp.MyJaxBClass.BookEntry”作为元素,因为它缺少@XmlRootElement注释]

如何以编程方式正确地将节点添加到任何列表?

1 个答案:

答案 0 :(得分:1)

您必须提供根XML元素,这对于每个有效的XML文档基本上都是必需的。 有两种方法可以声明我带来的根元素。

A)在代码中,创建一个根JAXBElement并将其传递给marshaller:

QName qName = new QName("com.example.jaxb.model", "book-entry");
JAXBElement<BookEntry> root = new JAXBElement<BookEntry>(qName, BookEntry.class, book);
...
marshaller.marshal(root, document);

B)使用@XmlRootElement(...)

为您的模型添加注释
@XmlRootElement(name = "book-entry", namespace = "com.example.jaxb.model")
public class BookEntry { ... }

两种选择都应该产生相同的结果。