我有一个xml标签Hello,我的java中有一个如下所示的字段
class HelloWorld{
@XmlElement
private String name;
}
虽然解组成功将Hello值赋给name变量。现在我想从我正在进行编组的THIS java对象(HelloWorld)创建一个新的xml但是在这种情况下我需要一个xml标签而不是我的XML。 我怎样才能在Jaxb中实现这一目标?
两个Xml都不在我的控制范围内,所以我无法更改标签名称
修改
传入XMl - helloworld.xml
<helloworld>
<name>hello</name>
</helloworld>
@XmlRootElement(name="helloworld)
class HelloWorld{
@XmlElement(name="name")
private String name;
// setter and getter for name
}
JaxbContext context = JAXBContext.newInstance(HelloWorld.class);
Unmarshaller un = conext.createUnmarshaller un();
HelloWorld hw = un.unmarshal(new File("helloworld.xml"));
System.out.println(hw.getName()); // this will print hello as <name> tag is mapped with name variable.
现在我想使用HelloWorld对象的这个hw对象来创建一个像下面这样的xml
<helloworld>
<name_1>hello</name_1> // Note <name> is changed to <name_1>
</helloworld>
我不想创建像Helloworld这样的另一个类,并在该新类中声明变量name_1。我想重用这个HelloWorld类只是因为标签名称已被更改。
但我使用现有的HelloWorld类并尝试编组对象hw,如下所示
JaxbContext context = JAXBContext.newInstance(HelloWorld.class);
Marshaller m = conext.createMarshaller();
StringWriter writer = new StringWriter();
m.marshal(hw,writer);
System.out.println(writer.toString());
这将打印如下
<helloworld>
<name>hello</name>
</helloworld>
但我需要
<helloworld>
<name_1>hello</name_1> // Note <name> is changed to <name_1>
</helloworld>
原因是在解组之前传入的xml和编组之后的传出xml不在我的控制之下。
希望这能解释。
答案 0 :(得分:0)
您可以使用XSLT转换将JAXBSource
转换为您想要的XML:
// Create Transformer
TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xslt = new StreamSource(
"src/blog/jaxbsource/xslt/stylesheet.xsl");
Transformer transformer = tf.newTransformer(xslt);
// Source
JAXBContext jc = JAXBContext.newInstance(Library.class);
JAXBSource source = new JAXBSource(jc, catalog);
// Result
StreamResult result = new StreamResult(System.out);
// Transform
transformer.transform(source, result);
了解更多信息
注意:我是MOXy领导。
MOXy提供了一个映射文档扩展,可用于覆盖字段/属性级别的映射。这意味着您可以仅在注释上创建一个JAXBContext
,然后根据带有XML重写的注释创建第二个JAXBContext
。
了解更多信息