2012-02-14 13 views
2

私はpojoを持っています。これにはJAX-Bアノテーションが付いています。私はsetterとgetterを使ってオブジェクトを生成します。私はマーシャラーを使用してxmlを文書に書き出します。これは最終的に別のAPIによって出力ストリームに書き込まれます。リテラルxmlのJax-bシリアライズ

Object o = new Object('blah','blah','blah'); 
Document doc = db.newDocument(); 
marshaller.marshal(o, doc); 

は、しかし、私は私のPOJOのフィールドのいずれかの属性として設定する必要があり、XMLの文字列を持っているが、私はそれがない文字列として、XMLとして整列化する必要があります。それはxhtmlなので、私は形式を知っています。これをやり遂げるにはどうすればいいですか?私はxsdを持っていますが、明らかにxmlの "タイプ"はありません。

//need to do this 
String xml = <tag>hello</tag>; 
Object o = new Object('blah','blah','blah'); 
o.setThisXmlField(xml); 
marshaller.marshal(o, doc); 

編集 - >これは私が

<xs:element name="course"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="courseSummary" type="courseSummary"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

<xs:complexType name="courseSummary"> 
    <xs:sequence> 
     <xs:any/> 
    </xs:sequence> 
</xs:complexType> 

これを達成する方法である等の生成されたJavaコードを使用する:あなたの最善の策は、のコンテンツを囲むために、おそらくです

Tidy tidy = new Tidy(); 
tidy.setXHTML(true); 
String courseSummary = "some turruble xml <b>REALLY RUBBISH</li>"; 
Course c = new Course(); 
Document courseSummaryDoc = tidy.parseDOM(IOUtils.toInputStream(courseSummary),null); 
CourseSummary summary = new CourseSummary(); 
summary.setAny(courseSummaryDoc.getDocumentElement()); 
c.setCourseSummary(summary); 

答えて

3

私はおそらくXSDを可能にするために、あなたのコンテンツモデルを記述するために使用されるXMLスキーマを変更します:あなたはXHTMLコンテンツを挿入したい任意の場所。その場所で許可された要素をさらに制限する場合は、xsd:anyをXHTML名前空間だけに一致させるように制限することができます。

これで、xsd:any on JAXB実装ルールに従うだけで、出力はXMLとして送信されます。

XSDから起動しない場合、上記のリンクは、xsd:anyと同等のものを記述するために必要なアノテーションも表示します。

@XmlAnyElement 
public List<Element> getAny(); 

ここで、Elementはorg.w3c.dom.Elementです。

+2

+1 - @XmlAnyElementを@XmlAnyElement(MyDomHandler.class)のような 'DomHandler'で使用する場合は、XMLフラグメントを' Element'ではなく 'String'として表すことができます:http://blog.bdoughan。 com/2011/04/xmlanyelement-and-non-dom-properties.html –

+0

ありがとう!これが解決策でした。 –

1

あなたのxmlタグはCDATAブロックにあります。あなたはそのJAXBのためOUTPUTFORMATを構成することによって行うことができます。

OutputFormat of = new OutputFormat(); 
of.setCDataElements(new String[] { "thisXmlField"}); 
XMLSerializer serializer = new XMLSerializer(of); 
marshaller.marshal(o, serializer.asContentHandler()); 
+0

これは、既存のオブジェクトのコンテキスト内で前記XMLを含むでしょうか?オブジェクトグラフとそれに続くxmlにどうやって統合されるのかは分かりません。 –