3

我有一个看起来像这样的 xsd(片段):

<xs:complexType name="IDType">
  <xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="FileID"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="IDNumber1" minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Number"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="PNumber"   minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="SS"        minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Player"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Prior"     minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="BIN"       minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Mutual"    minOccurs="0" maxOccurs="1" type="an..35" />
  </xs:choice>
</xs:complexType>
<xs:simpleType name="an..35">
  <xs:restriction base="an">
    <xs:maxLength value="35" />
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="an">
   <xs:restriction base="xs:string">
     <xs:pattern value="[ !-~]*" />
   </xs:restriction>
</xs:simpleType>

出于某种原因,这是生成的 Java 代码:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IDType", propOrder = {
    "fileID"
})
public class PatientIDType {
    @XmlElementRefs({
        @XmlElementRef(name = "FileED", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "IDNumber1", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Number", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "PNumber", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "SS", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Plaer", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Prior", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "BIN", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Mutual", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class)
    })
    protected List<JAXBElement<String>> fileID;
    /**
     * Gets the value of the fileID 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 fileID property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getFileID().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     */
    public List<JAXBElement<String>> getFileID() {
        if (fileID == null) {
            fileID = new ArrayList<JAXBElement<String>>();
        }
        return this.fileID;
    }

为什么类是这样生成的,而不是某种字符串数组?我真的不想每次都创建 JAXBElements 吗?

我怎样才能让它为每个简单地表示字符串或类似的类型生成类?

提前致谢,

伊恩

4

3 回答 3

6

生成此代码是因为您的复杂类型 IDType 包含一个 maxOccurrence 大于 1 的选项,此处:

<xs:choice minOccurs="1" maxOccurs="2">

此列表的内容是名称不同但类型相同的元素。这在标准的面向对象模型中没有等价物。然后 JAXB 使用JAXBElement该类来解决这个问题: aJAXBElement包装一个包含数据的简单对象,并将其分配给QName.

因此,您可以通过提供以下内容来明确地读取该列表并写入该列表:

  • 数据对象(在您的情况下为字符串,因为来自字符串的所有限制都表示为 Java 字符串)
  • 一个JAXBElementgetValue()方法返回字符串

JAXB 规范包含关于如何处理重复选择和重复序列的相当详细且相当复杂的解释。请注意,如果您的序列包含不同类型和不同名称的对象,您最终会得到List<Object>

这是很长的解释,现在这里有一些选项:

  • 如果您可以修改架构,请在 8 个项目周围放置一个包装器元素,例如“Wrapper”。Wrapper 将包含单个选择的元素;然后使 IDType 包含一系列 Wrapper 元素,其中 minOccurs = 1 和 maxOccurs = 2。
  • 自己创建一些辅助函数来快速创建 JAXBElements。JAXB 在您的目标包中放置了一个可以帮助您的 Factory 类 - 例如,它包含对 Schema 命名空间的引用等。
于 2009-05-03T19:52:23.753 回答
4

您的 ObejctFActory 类应该具有用于​​ thosr 值的 createMethod,类似于

@XmlElementDecl(namespace = "http://www.surescripts.com/messaging", name = "SocialSecurity", scope = PatientIDType.class)
public JAXBElement<String> createPatientIDTypeSocialSecurity(String value) {
    return new JAXBElement<String>(_PayerIDTypeSocialSecurity_QNAME, String.class, PatientIDType.class, value);
}
于 2011-12-21T22:14:04.953 回答
1

如果您使用的是 Sun JAXB 实现,您可以尝试在启用 xjc:simple 模式的情况下进行编译。有关示例,请参阅有关简化绑定的文档。应该转

public class PatientIDType {
    protected List<JAXBElement<String>> fileID;
}

进入

public class PatientIDType {
    String fileID;
    ...
}

您需要使用绑定自定义文件编译您的架构。有关如何执行此操作的示例,请参阅Kohsuke 的博客。

于 2009-04-26T21:59:13.447 回答