XSD anytype和JAXB

时间:2010-08-15 16:04:46

标签: xsd jaxb

我有一个xsd定义(来自www.tmforum.org ossj common api v1.5)

<element name="primaryKey" nillable="false">
   <complexType mixed="false">                   
      <complexContent mixed="false">
         <extension base="anyType"/>                   
      </complexContent>
   </complexType>
</element>

并希望按如下方式生成xml

<ossj-co-v1-5:primaryKey>mykey</ossj-co-v1-5:primaryKey>

使用xjc从xsd生成的PrimaryKey类需要将DOM元素存储在列表中(请参阅底部生成的PrimaryKey类“。”myKey“这里是一个TextNode,因为它不是DOM元素,所以它不能添加到xjc生成的PrimaryKey类。我应该如何继续获取所需的输出?

这是从xsd

生成的PrimaryKey类
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
    "any"
    })
public static class PrimaryKey {

    @XmlAnyElement
    protected List<Element> any;
    @XmlAnyAttribute
    private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    public List<Element> getAny() {
        if (any == null) {
            any = new ArrayList<Element>();
        }
        return this.any;
    }


    public Map<QName, String> getOtherAttributes() {
        return otherAttributes;
    }

}

2 个答案:

答案 0 :(得分:3)

以下对象模型适用于您的方案。我将尝试挖掘适当的模式自定义以生成这些对象模型。

选项#1

您的代码可能如下所示。这意味着元素“primaryKey”将导致对象PrimaryKey被实例化,并在any属性上设置相应的文本内容。

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

    @XmlValue
    protected String any; 

    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    public List<Element> getAny() { 
        if (any == null) { 
            any = new ArrayList<Element>(); 
        } 
        return this.any; 
    } 


    public Map<QName, String> getOtherAttributes() { 
        return otherAttributes; 
    } 

} 

选项#2

如果希望外部对象具有与primaryKey对应的String属性,则可以执行以下操作:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root {

    // @XmlElement is implied
    private String primaryKey;

}

答案 1 :(得分:1)

选项#1 getAny()无法返回String,因为签名返回List。

选项#2确实有效。谢谢!

以下是我的OSSJ代码修改的外观:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ManagedEntityKey", propOrder = {
    "applicationContext",
    "applicationDN",
    "type",
    "primaryKey"
})
public class ManagedEntityKey {
   @XmlElement(required = true)
   protected String primaryKey;
   //protected ManagedEntityKey.PrimaryKey primaryKey;

当然,应该修改制定者和吸气剂的签名。