Как частично маршалировать / демаршаллировать объект? - PullRequest
2 голосов
/ 18 июля 2011

У меня есть класс A с атрибутами B b и C c, который я хочу маршалировать и демаршировать таким образом, чтобы в c вместо графов объектов Java я хотел получить строковое представление фрагмента XML, то есть

@XmlRootElement(namespace="test")
public class A {
   B b;
   C c;
   //omitting getters and setters
}

public class C {
   String xmlFragment;
   //This string will contain the following:
   //"<d>d</d><e><f>f1</f><f>f2</></e>
}

и полученный / производящий XML будет выглядеть так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A xmlns="test">
 <B>some B content that is mapped to java objects</B>
 <C>
   <d>d</d><e><f>f1</f><f>f2</></e>
 </C>
</A>

Как мне добиться этого с помощью JAXB?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

JAXB не совсем это сделает.Он может обработать org.w3c.dom.Element и сериализовать его как XML, то есть

@XmlRootElement(namespace="test")
public class A {
   B b;
   @XmlAnyElement Element c;
}

Так что вам нужно проанализировать этот фрагмент XML в Element (например, используя DocumentBuilderFactory), а затемэто будет работать.

Вы могли бы, я полагаю, проанализировать Element во время выполнения, но быть очень осторожным с падением производительности:

@XmlRootElement(namespace="test")
public class A {
   B b;
   String xmlFragment;

   @XmlAnyElement
   public Element getXmlFragment() {
       InputSource source = new InputSource(new StringReader(xmlFragment));
       Document doc = DocumentBuilderFactory.newInstance().parse(source);
       return doc.getDocumentElement();
   }
}
1 голос
/ 18 июля 2011

Вам нужно будет использовать реализацию XmlAdapter для типа C.

@XmlRootElement(namespace="test")
public class A {
   B b;
   @XmlJavaTypeAdapter(MyAdapter.class)
   C c;
    //omitting getters and setters
} 

class MyAdapter extends XmlAdapter<String,C> {
   public C unmarshal(String s) {
      // custom unmarshalling
      return null;
   }
   public String marshal(C c) {
      // custom marshalling
      return "blah";
   }
}

Надеюсь, это то, что вам нужно.

С уважением, Юсуф

...