2008-12-05 70 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"; 
    } 
} 
相关问题