2017-03-22 13 views
1

に任意のオブジェクトとしてDOMノードを追加します。基本的に、私が試したことはノードを作成し、任意のリストに追加されます。は私がどんな要素を持つJAXBクラスを持つJAXBクラス

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の操作を行います。バックのxmlに全体のJAXBクラスをマーシャリング

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); 

はで失敗します例外:

com.sun.istack.SAXException2:それは@XmlRootElement注釈が欠落しているので、要素としてタイプ「MyApp.MyJaxBClass.BookEntry」をマーシャリングすることができない]

ノードを任意のリストにプログラムで正しく追加するにはどうすればよいですか?

答えて

1

ルートXML要素を指定する必要があります。これは基本的にすべての有効なXML文書で必須です。 私が来たルート要素を宣言するには2通りの方法があります。

A)のコードで、ルートJAXBElementを作成し、マーシャラーに渡し:

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 { ... } 

両方の選択肢が同じで生成する必要があります結果。

+0

ありがとうございました!私のJaxbクラスをJAXBElementにラップするのは、このトリックでした。だからA)私のために働いた! – Certainly

関連する問題