2012-11-21 102 views
3
public class Person { 
    public String name; ... 
} 

當我我marhsal想與價值屬性JAXB馬歇爾菲爾德與屬性

<name value="arahant" /> 

,而不是一個名稱節點XML節點:

<name>arahant</name> 

我怎樣才能做到這一點?我試着查看XmlElementWrapper,但只允許用於集合。我需要爲此編寫自定義代碼嗎?

回答

3

有幾個選項可用於支持此用例。


選項1 - XmlAdapter任何JAXB(JSR-222)實現

這項辦法將與任何兼容JAXB (JSR-222)實施工作。

ValueAdapter

XmlAdapter讓您編組一個對象就好像它是另一個對象。在我們的XmlAdapter中,我們將將String值轉換爲/來自具有與@XmlAttribute映射的一個屬性的對象。

package forum13489697; 

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

public class ValueAdapter extends XmlAdapter<ValueAdapter.Value, String>{ 

    public static class Value { 
     @XmlAttribute 
     public String value; 
    } 

    @Override 
    public String unmarshal(Value value) throws Exception { 
     return value.value; 
    } 

    @Override 
    public Value marshal(String string) throws Exception { 
     Value value = new Value(); 
     value.value = string; 
     return value; 
    } 

} 

@XmlJavaTypeAdapter註釋用於指定該XmlAdapter應與字段或屬性來使用。

package forum13489697; 

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
public class Person { 

    @XmlJavaTypeAdapter(ValueAdapter.class) 
    public String name; 

} 

選項#2 - 的EclipseLink JAXB(莫西)

我是EclipseLink JAXB (MOXy)鉛和我們提供的@XmlPath擴展,它可以讓你輕鬆做基於路徑映射。你需要

package forum13489697; 

import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
public class Person { 

    @XmlPath("name/@value") 
    public String name; 

} 

jaxb.properties

要指定莫西爲您的JAXB提供者包括在同一封裝稱爲jaxb.properties爲您的域模型文件與以下條目(請參閱:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

DEMO CODE

下面演示代碼可與選項一起使用:

演示

package forum13489697; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Person.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13489697/input.xml"); 
     Person person = (Person) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(person, System.out); 
    } 

} 

input.xml中/輸出

<?xml version="1.0" encoding="UTF-8"?> 
<person> 
    <name value="arahant" /> 
</person> 
-1
@XmlElement 
public String name;