Java 如何编写在jaxb中无法控制的对象?
我正试图找到一种方法来马歇尔我无法访问的课程。我正在努力实现这样的目标:Java 如何编写在jaxb中无法控制的对象?,java,xml,jaxb,Java,Xml,Jaxb,我正试图找到一种方法来马歇尔我无法访问的课程。我正在努力实现这样的目标: @XmlRootElement(name="bar") class Bar { @XmlAttribute private Foo foo; @XmlAttribute private String baz; } <bar baz="stuff" foo="otherstuff"/> 这将产生如下xml文件: @XmlRootElement(name="bar") class Bar {
@XmlRootElement(name="bar")
class Bar {
@XmlAttribute
private Foo foo;
@XmlAttribute
private String baz;
}
<bar baz="stuff" foo="otherstuff"/>
这将产生如下xml文件:
@XmlRootElement(name="bar")
class Bar {
@XmlAttribute
private Foo foo;
@XmlAttribute
private String baz;
}
<bar baz="stuff" foo="otherstuff"/>
这可能吗?我试图摆弄
@XmlJavaTypeAdapter
,但没有成功。如果您无权访问用于生成XML文件的类,但可以访问基于/用于生成这些类的模式,那么您应该能够使用xjc和模式定义(xsd)重新生成这些类文件。您使用XmlJavaTypeAdapter的方法是正确的,但我怀疑foo需要是一个XmlElement而不是一个XmlAttribute:
@XmlRootElement(name="bar")
public class Bar {
@XmlElement
@XmlJavaTypeAdapter(FooAdapter.class)
private Foo foo;
@XmlAttribute
private String baz;
}
FooAdapter可以像下面这样简单,但是如果您创建一个代理对象来表示Foo并封送它,而不是对象[],那么输出会更漂亮
class FooAdapter extends XmlAdapter<Object[], Foo> {
@Override
public Object[] marshal(Foo v) throws Exception {
return new Object[]{ v.x, v.y, v.z };
}
@Override
public Foo unmarshal(Object[] v) throws Exception {
Foo foo = new Foo();
foo.x = (String) v[0];
foo.y = (Integer) v[1];
foo.z = (Double) v[2];
return foo;
}
}
class FooAdapter扩展了XmlAdapter{
@凌驾
公共对象[]封送处理(Foo v)引发异常{
返回新对象[]{v.x,v.y,v.z};
}
@凌驾
public Foo unmarshal(对象[]v)引发异常{
Foo-Foo=新的Foo();
foo.x=(字符串)v[0];
foo.y=(整数)v[1];
foo.z=(双)v[2];
返回foo;
}
}
您可以访问Bar源代码,但不能访问Foo?您可以使用EclipseLink JAXB(MOXy)中的外部映射文档:@KyleMahan Bar source是,Foo source否。。。没错,嗯。。。我想我还不够清楚。。。没有xml架构。。。一切都是基于注释的。它归结为一个问题:“当我无法访问这些类时,我如何教授JAXB关于新类的知识?”是的,这非常好用。。。实际上,如果您创建一个XmlAdapter
,它甚至可以与@xmldattribute
一起工作。有没有一种方法可以不使用Bar类就离开Marshaller
有一个采用XmlAdapter
的setAdapter
函数。。。但是仅注册FooAdapter
和编组Foo
是不起作用的。