我有一个预定义的xsd模式(不幸的是,我无法修改),我想通过JAXB为其生成相应的JAVA类。目前,我正在尝试定义如下的复杂类型。

  <xsd:complexType name="AttributeType">
    <xsd:complexContent>
      <xsd:extension base="xsd:anyType">
        <xsd:attribute name="id" type="xsd:anyURI" use="required"/>
        <xsd:anyAttribute processContents="lax"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>


提供的XML示例允许直接字符串内容,如下所示:

<attribute id="myValue">201</attribute>


以及像这样的嵌入式xml:

<attribute id="address">
    <example:Address xmlns:example="http://example.com/ns">
        <Street>100 Nowhere Street</Street>
        <City>Fancy</City>
        <State>DC</State>
        <Zip>99999</Zip>
    </example:Address>
</attribute>


当运行xjc进程而不进行进一步的绑定修改时,我得到一个像这样的类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AttributeType", propOrder = {
    "any"
})
public class AttributeType {

    @XmlAnyElement
    protected List<Element> any;
    @XmlAttribute(name = "id", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String id;
    @XmlAnyAttribute
    private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    // getter setter omitted
}


问题是,我无法获得第一个示例的字符串内容。这可能引用了XSD anytype and JAXB,但实际上我不知道要不修改XSD就无法实现。因此,如何获取字符串内容?顺便说一句。我正在使用maven cxf-codegen-plugin生成源。

最佳答案

我认为问题出在以下事实:生成的映射查找的是子元素,而不是文本。

如果您可以修改XSD,则解决方案是:

<xsd:complexType name="AttributeType">
    <xsd:complexContent mixed="true">
      <xsd:extension base="xsd:anyType">
       <xsd:attribute name="id" type="xsd:anyURI" use="required"/>
       <xsd:anyAttribute processContents="lax"/>
      </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>


但是因为你不能...

如果您有能力修改源代码,请更改:

@XmlAnyElement
protected List<Element> any;




@XmlAnyElement
@XmlMixed
protected List<Object> any;


“对象”列表的子元素应包含Element,文本应包含String

09-25 21:35