Как я могу преобразовать объект (JAXB) или byte [] (из этого объекта) в `org.w3c.dom.Element`? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть класс Java (JAXB), например:

Test test = new Test();
test.set....
//fill test object
............

Теперь мне нужно преобразовать этот объект в org.w3c.dom.Element

Теперь у меня есть конвертер для преобразования в byte[]:

public <T> byte[] marshal(T value) {
    try {
      StringWriter sw = new StringWriter();
      Marshaller marshaller = jaxbContext.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      marshaller.marshal(value,sw);
      return sw.toString().getBytes();
    } catch (JAXBException e) {
      throw new RuntimeException(e.getMessage());
    }
  }

И мой вопрос: как мне конвертировать test или byte[] в to org.w3c.dom.Element?

EDIT:

ответьте на вопрос в комментарии, зачем мне это нужно

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "any"
})
@XmlRootElement(name = "MessagePrimaryContent")
public class MessagePrimaryContent {

    @XmlAnyElement
    protected Element any;


    public Element getAny() {
        return any;
    }


    public void setAny(Element value) {
        this.any = value;
    }

}

Мне нужно установить Мой объект на setAny метод. Такой протокол и формат. Я не изобрел это

1 Ответ

0 голосов
/ 29 августа 2018

Прежде всего, вместо @XmlAnyElement Element any я бы использовал @XmlAnyElement(lax = true) Object any. Затем вы можете просто назначить test на any и позволить JAXB его маршалировать. Смотрите этот ответ:

https://stackoverflow.com/a/9692275/303810

Таким образом, вы можете избежать предварительной маршаллизации как DOM.


Теперь к вашему вопросу.

Вы в основном хотите маршалировать свой test объект как элемент DOM. Проще всего было бы выполнить маршал до DOMResult и затем получить оттуда элемент.

Что-то вроде:

  marshaller = jaxbContext.createMarshaller();
  DOMResult domResult = new DOMResult();
  marshaller.marshal(value, domResult);
  Node rootNode = domResult.getNode();
  // I'm not quite sure that it's always a Document, but it's easy to figure out
  final Element rootElement = ((Document) rootNode).getDocumentElement();
...