public class Person {
public String name; ...
}
當我我marhsal想與價值屬性JAXB馬歇爾菲爾德與屬性
<name value="arahant" />
,而不是一個名稱節點XML節點:
<name>arahant</name>
我怎樣才能做到這一點?我試着查看XmlElementWrapper,但只允許用於集合。我需要爲此編寫自定義代碼嗎?
public class Person {
public String name; ...
}
當我我marhsal想與價值屬性JAXB馬歇爾菲爾德與屬性
<name value="arahant" />
,而不是一個名稱節點XML節點:
<name>arahant</name>
我怎樣才能做到這一點?我試着查看XmlElementWrapper,但只允許用於集合。我需要爲此編寫自定義代碼嗎?
有幾個選項可用於支持此用例。
選項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>
@XmlElement
public String name;