当前位置: 首页 > 知识库问答 >
问题:

使JAXB XJC为简单类型生成一个包装类

哈翔
2023-03-14

我有以下xml类型:

<xsd:element name="FaxNumbers" minOccurs="0">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

FaxNumber类型如下所示:

<xsd:simpleType name="FaxNumber">
    <xsd:restriction base="xsd:string">
        <xsd:minLength value="1" />
    </xsd:restriction>
</xsd:simpleType>

生成的xml应该如下所示:

<FaxNumbers>
    <FaxNumber>3878374</FaxNumber>
    <FaxNumber>387833434</FaxNumber>
    <FaxNumber>3878334</FaxNumber>
</FaxNumbers>

运行JAXB XJC从XSD生成java类时,它会生成以下类:

@XmlType(name = "FaxNumbers")
public class FaxNumbers  {

    /**
     * No comment.
     */
    @XmlElement(name = "FaxNumber", required = true)
    protected List<String> faxNumber = new ArrayList<String>();

}

但是,我想绑定FaxNumber到这样的复合类:

@XmlType(name = "FaxNumbers")
public class FaxNumbers  {

    /**
     * No comment.
     */
    @XmlElement(name = "FaxNumber", required = true)
    protected List<FaxNumber> faxNumber = new ArrayList<String>();

}

Where FaxNumber class looks like this:

public class FaxNumber{

    @XmlValue
    private String value;
}

有没有办法在JAXB绑定xml中定义这样的绑定?

注意:不幸的是,我无法控制并且无法更改XSD

共有3个答案

颜杰
2023-03-14

以下作品对我来说。希望有帮助!

XSD:

 <xsd:schema xmlns="http://www.hcentive.com/ws/eligibility/schema/beans"
    targetNamespace="http://www.hcentive.com/ws/eligibility/schema/beans"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="FaxNumbers">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:complexType name="FaxNumber">
    <xsd:sequence>
        <xsd:element type="xsd:string" name="value" />
    </xsd:sequence>
</xsd:complexType>
</xsd:schema>

生成的对象:传真号码。JAVA

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "faxNumber"
})
@XmlRootElement(name = "FaxNumbers")
public class FaxNumbers {

    @XmlElement(name = "FaxNumber", required = true)
    protected List<FaxNumber> faxNumber;

    /**
     * Gets the value of the faxNumber property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the faxNumber property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getFaxNumber().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link FaxNumber }
     * 
     * 
     */
    public List<FaxNumber> getFaxNumber() {
        if (faxNumber == null) {
            faxNumber = new ArrayList<FaxNumber>();
        }
        return this.faxNumber;
    }

}
谢善
2023-03-14

而不是行

阳长恨
2023-03-14

我不认为您可以让xjc为您生成这样一个FaxNumber类,但是您可以自己编写它,然后使用外部绑定文件将其插入正确的位置。

package com.example;
public class FaxNumber {
  private String value;
  // getter/setter

  public static FaxNumber parse(String s) {
    FaxNumber n = new FaxNumber();
    n.value = s;
    return n;
  }

  public static String print(FaxNumber n) {
    return n.value;
  }
}

绑定:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           jaxb:version="2.0">
  <jaxb:bindings schemaLocation="example.xsd">
    <jaxb:bindings node="//xsd:simpleType[@name='FaxNumber']">
      <jaxb:javaType name="com.example.FaxNumber"
          parseMethod="com.example.FaxNumber.parse"
          printMethod="com.example.FaxNumber.print"/>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>
 类似资料:
  • 我想有一个可变的类模板来生成每种类型的一个方法,例如像下面这样的类模板: 将使方法

  • 问题内容: 我有一段代码需要在方法中传递字段的类。由于代码的机制,我只能处理引用对象,而不能处理基元。我想要一种简单的方法来确定一个类型是否为原始类型,并将其与适当的包装器类交换。所以到目前为止,我在代码中所做的是这样的: 除我需要显式检查所有原始类型并将其与适当的包装器类交换外,该方法工作正常。现在我知道没有那么多原始类型,简单地将它们全部列出就不会有问题,但是我想知道是否有一种更简单,更优雅的

  • 我在父类和子类中都有构建器。父对象有一个抽象生成器和一个扩展抽象生成器的具体生成器。子级有一个扩展父级抽象生成器的抽象生成器和一个扩展子级抽象生成器的具体生成器。原因是父级的setter返回当前的Builder类。我有一些方法返回类自己的抽象构建器类型,我想将其称为父抽象类型(调用它的父方法)。我所能做的就是

  • 我正在尝试使用以下方法在运行时获取Avro模式: 但由于我的POJO类包含以下泛型: 我得到以下例外情况: 我知道Avro不会支持泛型类型。是否有一种方法可以在运行时生成架构时从类中省略某些类字段?

  • 问题内容: 我已经开始使用Spring学习Apache CXF。首先,我尝试创建一个简单的客户端/服务器模型。 服务器端是: service.HelloWorld.java service.HelloWorldImpl.java 客户端是: client.Client.java 公共类Client { cxf-client-servlet.xml 问题是:要使客户端正常工作,我必须向客户端的项目添

  • 我目前正在读一本名为Java的完整参考的书。第18章介绍了基元类型包装器。 正如本书第一部分所提到的,出于性能原因,Java使用基本类型,如int和char。这些数据类型不是对象层次结构的一部分。它们通过值传递给方法,不能直接通过引用传递。另外,有时两个方法无法引用同一个int实例,您需要为这些基元类型之一创建对象表示。例如,第19章讨论的集合类只处理对象;若要在这些类中的一个中存储基元类型,需要