2013-10-28 60 views
2

我想将Java对象编组为XML。对于此方法,我将JAXB Moxy与外部XML绑定文件一起使用。将自定义值添加到外部绑定(JAXB-MOXY实现)

这里,我想编组为XML的示例类:

public class Customer { 
    private String lastname; 
    private String firstname; 

    //getters and setters 
} 

随着我的外部约束力的文件,我可以访问这个类的价值观,让我得到以下XML输出:

<?xml version="1.0"?> 
<customer> 
    <firstname>Tony</firstname> 
    <lastname>Stark</lastname> 
</customer> 

现在我想添加一个自定义标签,其中没有在java类中指定的自定义值。因此,对于上述客户类我想要一个XML输出是这样的:

<?xml version="1.0"?> 
<customer> 
    <firstname>Tony</firstname> 
    <lastname>Stark</lastname> 
    <birthdate>01.01.1990</birthdate> 
</customer> 

生日是不是在客户一流的,我不希望有加,因为这个类是automaticaly由脚本生成的。我的目标是在外部绑定文件中用我的自定义值定义birthdate。这甚至可以用JAXB MOXY实现吗? 希望有人能帮助我。

回答

2

以下是你可以利用的XmlAdapter做到这一点的方式:

XmlAdapter(LastNameAdapter)

import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class LastNameAdapter extends XmlAdapter<LastNameAdapter.AdaptedLastName, String> { 

    @XmlType(propOrder={"lastname", "birthdate"}) 
    public static class AdaptedLastName { 
     public String lastname; 
     public String birthdate; 
    } 

    private String birthdate; 

    public LastNameAdapter() { 
    } 

    public LastNameAdapter(String birthdate) { 
     this.birthdate = birthdate; 
    } 

    @Override 
    public String unmarshal(AdaptedLastName v) throws Exception { 
     return v.lastname; 
    } 

    @Override 
    public AdaptedLastName marshal(String v) throws Exception { 
     AdaptedLastName adaptedLastName = new AdaptedLastName(); 
     adaptedLastName.lastname = v; 
     adaptedLastName.birthdate = birthdate; 
     return adaptedLastName; 
    } 

} 

外部元数据(oxm.xml)

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum19641824"> 
    <java-types> 
     <java-type name="Customer"> 
      <xml-root-element/> 
      <xml-type prop-order="firstname lastname"/> 
      <java-attributes> 
       <xml-element java-attribute="firstname"/> 
       <xml-element java-attribute="lastname" xml-path="."> 
        <xml-java-type-adapter value="forum19641824.LastNameAdapter"/> 
       </xml-element> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

演示

import java.util.*; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum19641824/oxm.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, properties); 

     Customer customer = new Customer(); 
     customer.setFirstname("Tony"); 
     customer.setLastname("Stark"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setAdapter(new LastNameAdapter("01.01.1990")); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(customer, System.out); 
    } 

} 

输出

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <firstname>Tony</firstname> 
    <lastname>Stark</lastname> 
    <birthdate>01.01.1990</birthdate> 
</customer> 
+0

感谢。这就是我一直在寻找的。 – user1367922

相关问题