注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
下面是如何使用 MOXy 的外部映射文件扩展名来支持这个用例。
XML 1 的元数据
我们将使用标准 JAXB 注释将Gobj
类映射到第一个 XML 表示。
package forum17652921;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="xml1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Gobj {
@XmlElement(name="a")
String fName;
@XmlElement(name="b")
String lName;
@XmlElement(name="c")
String id;
}
XML 2 的元数据
我们将使用 MOXy 的外部映射文档将同一个类映射到第二个 XML 表示。默认情况下,映射文档用于扩充注释提供的元数据。如果我们将xml-metadata-complete
flag 设置为 true,那么您可以完全替换该元数据。
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum17652921"
xml-accessor-type="FIELD"
xml-mapping-metadata-complete="true">
<java-types>
<java-type name="Gobj">
<xml-root-element name="xml2"/>
<java-attributes>
<xml-element java-attribute="fName" xml-path="d/name/my/text()"/>
<xml-element java-attribute="lName" name="e"/>
<xml-element java-attribute="id" name="f"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
演示
在下面的演示代码中有两个JAXBContext
. 我们将使用第一个读取 XML 表示 1 到Gobj
. 然后我们将使用第二个JAXBContext
将相同的实例编组Gobj
到第二个 XML 表示。
package forum17652921;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc1 = JAXBContext.newInstance(Gobj.class);
Unmarshaller unmarshaller = jc1.createUnmarshaller();
File xml = new File("src/forum17652921/xml1.xml");
Gobj gobj = (Gobj) unmarshaller.unmarshal(xml);
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17652921/oxm.xml");
JAXBContext jc2 = JAXBContext.newInstance(new Class[] {Gobj.class}, properties);
Marshaller marshaller = jc2.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(gobj, System.out);
}
}
xml1.xml
<xml1>
<a>hello</a>
<b>shreyas</b>
<c>123</c>
</xml1>
输出
<?xml version="1.0" encoding="UTF-8"?>
<xml2>
<d>
<name>
<my>hello</my>
</name>
</d>
<e>shreyas</e>
<f>123</f>
</xml2>
了解更多信息