文字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。
您最好的选择可能是封闭的内容你的XML标签在CDATA块中。你可以做到这一点通过配置JAXB的OUTPUTFORMAT:
OutputFormat of = new OutputFormat();
of.setCDataElements(new String[] { "thisXmlField"});
XMLSerializer serializer = new XMLSerializer(of);
marshaller.marshal(o, serializer.asContentHandler());
这将包括在现有对象的上下文中说xml?我没有看到如何将集成到对象图和随后的XML。 – 2012-02-14 18:09:35
+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
谢谢!这是解决方案。 – 2012-02-14 20:35:18