我正在尝试创建 JAXB 带注释的类来生成基于 Microsoft SharePoint 的 XML查询模式 http://msdn.microsoft.com/en-us/library/ms467521%28v=office.14%29.aspx。我有一个SpWhereClause
class:
@XmlType(name="Where")
@XmlAccessorType(XmlAccessType.FIELD)
public class SpWhereClause {
}
但我不确定如何构造/注释其属性。 A<Where>
元素可以有许多不同类型的子元素(<Eq>
, <BeginsWith>
, <Contains>
等等,让我们忽略<And>
and <Or>
暂时),但不能超过一个。Eq
and BeginsWith
是每个单独地的有效子女Where
,但不能是这样的:
<Where>
<Eq>...</Eq>
<BeginsWith>...</BeginsWith>
</Where>
没有嵌套<Eq>
and <BeginsWith>
in an <Or>
元素。
我的第一个想法是创建一个AbstractSpComparison
类与<FieldRef>
and <Value>
所有比较的共同要素:
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class AbstractSpComparison {
@XmlElement
private SpFieldRef fieldRef;
@XmlElement
private SpValue value;
...
}
然后有SpEqualsComparison
扩展它:
@XmlType(name="Eq")
public class SpEqualsComparison extends AbstractSpComparison {
}
但是,在中使用抽象类SpWhereClause
让我无法控制子元素的名称。这:
@XmlElement
private AbstractSpComparison comparison;
结果如下:
<Where>
<comparison>...</comparison>
</Where>
而不是这个:
<WHERE>
<Eq>...</Eq>
</WHERE>
为什么“Eq”这个名字不是来自SpEqualsComparison
用于命名比较元素?处理这种情况的正确方法是什么?
我考虑将所有可能的子元素类型作为属性SpWhereClause
,并且只设置我需要的一个(在某处有一些验证逻辑),但这似乎不必要地冗长。
如果重要的话,我正在使用弹簧OXM http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/oxm.html Jaxb2Marshaller
.