文字xml的Jax-b序列化

问题描述:

我有一个pojo,用JAX-B注释进行注释。我使用setter和getters来填充对象。我使用marshaller将xml写出到文档中,最终由另一个API写入输出流。文字xml的Jax-b序列化

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

不过,我有XML,我需要将其设置为我的POJO的一个字段属性的字符串,但我需要它被编组为XML,而不是作为一个字符串。它是xhtml,所以我知道格式。我怎么能这样做呢?我确实有一个xsd,但显然xml没有“type”。

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

我可能会修改用来描述你的内容模型允许的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和'DomHandler'如@XmlAnyElement(MyDomHandler.class),你可以将XML片段表示为一个String而不是'Element':http://blog.bdoughan。 com/2011/04/xmlanyelement-and-non-dom-properties.html – 2012-02-14 19:27:06

+0

谢谢!这是解决方案。 – 2012-02-14 20:35:18

您最好的选择可能是封闭的内容你的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。 – 2012-02-14 18:09:35