Jax-b сериализация литерального xml - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть pojo, которое отмечено аннотациями JAX-B.Я использую сеттеры и геттеры для заполнения объекта.Я использую маршаллер для записи xml в документ, который в конечном итоге записывается другим API-интерфейсом в outputtream.

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

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Возможно, я бы изменил XML-схему, используемую для описания вашей модели контента, чтобы разрешить xsd: любое место, где вы хотите внедрить ваш контент xhtml. Вы можете ограничить xsd: any, чтобы он соответствовал только пространству имен XHTML, если вы хотите дополнительно ограничить разрешенные элементы в этом месте.

Тогда вам просто нужно будет следовать xsd: any в правилах реализации JAXB , и результат будет отправлен в виде XML.

Если вы не начинаете с XSD, то вышеупомянутая ссылка также показывает аннотацию, которую вы должны использовать для описания эквивалента xsd: any.

@XmlAnyElement
public List<Element> getAny();

, где Элементом является org.w3c.dom.Element.

1 голос
/ 14 февраля 2012

Лучше всего, вероятно, заключить содержимое вашего тега xml в блок CDATA.Вы можете сделать это, настроив OutputFormat для JaxB:

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