2

javax.xml.bind我通过从 XSD生成的带注释的类来读取 XML 。

<xsd:complexType name="foo">
  <xsd:attribute name="bar" type="xsd:double" />
</xsd:complexType>

所以我的类生成为:

public Double getBar(){....}

好的,为了确保双属性是肯定的,我使用xsd:restriction.

<xsd:simpleType name="DoublePositive">
  <xsd:restriction base="xsd:double">
    <xsd:minExclusive value="0" />
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="foo">
  <xsd:attribute name="bar" type="DoublePositive" />
</xsd:complexType>

太糟糕了,xjc 生成一个 String 而不是 Double。

public String getBar(){....}

我可以强制使用 Double 而不是 String 吗?

解决方案:

我的问题是错误的。我有xsi:type="DoublePositive" 而不是type="DoublePositive"

4

1 回答 1

4

这是我的配置,我用它来生成类。

  1. test.xsd - 你的 xsd 文件

     <?xml version="1.0" encoding="utf-8"?>
     <xsd:schema elementFormDefault="qualified" targetNamespace=""
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    
       <xsd:simpleType name="DoublePositive">
         <xsd:restriction base="xsd:double">
           <xsd:minExclusive value="0"/>
         </xsd:restriction>
       </xsd:simpleType>
    
       <xsd:complexType name="foo">
         <xsd:attribute name="bar" type="DoublePositive"/>
       </xsd:complexType>
     </xsd:schema>
    
  2. text.xml - 具有全局绑定的文件。

    <jaxb:bindings version="2.1"
                    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
       <jaxb:globalBindings generateElementProperty="false">
         <jaxb:javaType name="java.util.Double" xmlType="DoublePositive"
                        parseMethod="Converter.fromString"
                        printMethod="Converter.toString"/>
       </jaxb:globalBindings> 
     </jaxb:bindings>
    
  3. Converter.java - 具有转换功能的类。

    public class Converter {
      public static Double fromString(String str){
        return Double.parseDouble(str);
      }
    
      public static String toString(Double value){
        return String.valueOf(value);
      }
    }
    

就这样。使用命令调用 xjc

xjc -b test.xml -classpath . test.xsd.

$ xjc-版本
xjc 版本“JAXB 2.1.10”
JavaTM Architecture for XML Binding (JAXB) 参考实现,(构建 JAXB 2.1.10)
$ xjc -b test.xml -classpath 。测试.xsd
解析架构...
[警告] EmptyTargetNamespace:在模式文档 'file:/pwd/test.xsd' 中,
“targetNamespace”属性的值不能为空字符串。  
文件的第 3 行:/pwd/test.xsd

编译架构...
生成/Adapter1.java
生成/Foo.java
生成/ObjectFactory.java

并生成文件内容:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo")
public class Foo {

    @XmlAttribute
    @XmlJavaTypeAdapter(Adapter1 .class)
    protected Double bar;

    /**
     * Gets the value of the bar property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public Double getBar() {
        return bar;
    }

    /**
     * Sets the value of the bar property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setBar(Double value) {
        this.bar = value;
    }

}

和适配器类

package generated;

import java.util.Double;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class Adapter1
    extends XmlAdapter<String, Double>
{


    public Double unmarshal(String value) {
        return (Converter.fromString(value));
    }

    public String marshal(Double value) {
        return (Converter.toString(value));
    }

}

因此,如您所见,xjc 正确地生成了类。如果你仍然得到一个String,那么也许你忘记在你的配置中添加一些东西了。但是如果没有有关您的配置的详细信息,就不可能说出您的代码有什么问题。

于 2014-01-27T13:50:04.447 回答