【问题标题】:Jax-b serialization of literal xml文本 xml 的 Jax-b 序列化
【发布时间】:2012-02-14 17:15:40
【问题描述】:

我有一个 pojo,它使用 JAX-B 注释进行了注释。我使用 setter 和 getter 来填充对象。我使用编组器将 xml 写入文档,最终由另一个 api 写入输出流。

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

但是,我有一个 xml 字符串,我需要将其设置为我的一个 pojo 字段的属性,但我需要将其编组为 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);

edit-->我就是这样完成的

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

【问题讨论】:

    标签: java xml xsd xml-serialization jaxb


    【解决方案1】:

    我可能会修改用于描述内容模型的 XML 模式,以允许 xsd:any 在您希望注入 xhtml 内容的位置。如果您希望进一步限制该位置允许的元素,您可以限制 xsd:any 以仅匹配 XHTML 命名空间。

    然后您只需遵循xsd:any on JAXB 实施规则,输出将作为 XML 发送。

    如果您不是从 XSD 开始,那么上面的链接还显示了您需要使用的注释来描述 xsd:any 的等效项。

    @XmlAnyElement
    public List<Element> getAny();
    

    其中 Element 是 org.w3c.dom.Element。

    【讨论】:

    • +1 - 如果您将@XmlAnyElement 与DomHandler 一起使用,例如@XmlAnyElement(MyDomHandler.class),您可以将您的XML 片段表示为String,而不是Element:@ 987654322@
    【解决方案2】:

    您最好的选择可能是将 xml 标记的内容包含在 CDATA 块中。您可以通过为 JaxB 配置 OutputFormat 来做到这一点:

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

    【讨论】:

    • 这会在现有对象的上下文中包含所述xml吗?我没有看到 of 将如何集成到对象图和后续 xml 中。
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多