根据JAXB中的Object属性在运行时生成节点类型

时间:2014-09-06 10:43:18

标签: java xml jaxb

我有一个像这样的bean类

@XmlRootElement
public class Node {
   String id;
   String value;
   // Composites, Node is having Node is having Node and so on
   ArrayList<Node> nodes = new ArrayList<Node>();

   // and getter and setters for all these field. 
}

我想使用JAXB封送此对象。默认情况下,它将创建名为“node”的元素,或者如果我们将根注释更改为其他内容(例如@XmlRootElement(name =“someotherName”)),则使用该名称创建。

但是我有数千个Node对象,我希望生成的元素名称应该是Object的“value”属性; e.g。

 Node node= new Node("myID", "myValue");

并且在编组之后,它应该像这样生成节点

   <myvalue>
     <id>myID</id>
   </myvalue>

有可能吗?我搜索了很多地方,但没有找到这样的东西。

此外,我希望将“id”属性作为属性(@xmlAttribute),但有条件地说,如果它的子节点(ArrayList)的大小为零,那么我希望将此(id)属性视为属性,否则不会。

由于

-Dharmendra

1 个答案:

答案 0 :(得分:0)

这种通用方法

<T> JAXBElement<T> wrap( String ns, String tag, T o ){
    QName qtag = new QName( ns, tag );
    Class<?> clazz = o.getClass();
    @SuppressWarnings( "unchecked" )
    JAXBElement<T> jbe = new JAXBElement( qtag, clazz, o );
    return jbe;
}

可以应用于Node对象:

Node node = new Node();
node.setId( "id-1" );
node.setValue( "value-1" );
JAXBContext jc = JAXBContext.newInstance( Node.class );
Marshaller m = jc.createMarshaller();
m.marshal( wrap( "", "myvalue", node ), System.out );

生产

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myvalue>
  <id>id-1</id>
  <value>value-1</value>
</myvalue>

某个字段的变量处理,无论是作为属性还是作为子元素,都是不可能的,并且允许我说:一个坏主意。它与所有良好做法相冲突,这些做法都有一个完善的定义,以便所有相关方知道要写什么和期待什么。

相关问题