2008-12-05 61 views

回答

0

你可以寫一對解析器/作家和結合JAXB XML定義屬性映射。

1

我可能會爲一個布爾值轉換爲int創建一個類型的適配器。 JAXB用戶指南中有一些examples

6

JAXB提供了一種靈活的方式來customize your bindings。您只需編寫一個XML文件,該文件將指出如何綁定XML和Java類型。在你的情況下,你可以使用<javaType>聲明,其中你可以指定parseMethodprintMethod。這些方法可以簡單到

public boolean myParseBool(String s) 
{ 
    return s.equals("1"); 
} 

public String myPrintBool(boolean b) 
{ 
    return b ? "1" : "0"; 
} 

可能存在更簡單的方法,也許使用DatatypeConverter,但我不知道夠這個主題,以幫助您更!

37

適配器類:

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

public class BooleanAdapter extends XmlAdapter<Integer, Boolean> 
{ 
    @Override 
    public Boolean unmarshal(Integer s) 
    { 
     return s == null ? null : s == 1; 
    } 

    @Override 
    public Integer marshal(Boolean c) 
    { 
     return c == null ? null : c ? 1 : 0; 
    } 
} 

用法:

@XmlElement(name = "enabled") 
@XmlJavaTypeAdapter(BooleanAdapter.class) 
public Boolean getEnabled() 
{ 
    return enabled; 
} 
+0

好極了!正是我需要的! – 2009-12-22 06:51:35

+0

爲什麼這不是被接受的答案? – kasdega 2013-04-13 13:19:48

6

有同樣的問題作爲user20298,我接着mtpettyp提示,並適應它爲我的配置。

我的配置是: - Maven構建項目。 - maven中的「org.jvnet.jaxb2.maven2」插件。 - JAXB 2.2.6 - 在此之際,我正在爲KML 2.2(ogckml22.xsd)Java類

我偶然發現了布爾的問題被渲染爲「真/假」,當谷歌地圖希望他們能夠爲「1/0」

這是Maven的插件配置:

<plugin> 
<groupId>org.jvnet.jaxb2.maven2</groupId> 
<artifactId>maven-jaxb2-plugin</artifactId> 
<executions> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>generate</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <generateDirectory>src/main/generated</generateDirectory> 
    <extension>true</extension> 
    <removeOldOutput>true</removeOldOutput> 
</configuration> 

我添加到src /主/資源文件夾中的JAXB的綁定。包含以下內容的xjb文件:

<?xml version="1.0" ?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      version="2.1" 
      xmlns:kml="http://www.opengis.net/kml/2.2" 
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <globalBindings> 
     <xjc:simple/> 
     <xjc:javaType name="java.lang.Boolean" 
         xmlType="xsd:boolean" 
         adapter="path.to.my.JaxbBooleanAdapter"/> 
    </globalBindings> 
    ... 
    ... 
</bindings> 

適配器類是這樣的:

package path.to.my; 

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

/** 
* Utility class to correctly render the xml types used in JAXB. 
*/ 
public class JaxbBooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
    @Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if ("1".equals(v)) 
     { 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     if (v == null) 
     { 
      return null; 
     } 
     if (v) 
     { 
      return "1"; 
     } 
     return "0"; 
    } 
} 
相關問題