JAXB绑定:重复元素的动态类名

时间:2015-05-27 20:56:51

标签: xml xpath xsd jaxb xjc

我有一个XSD,其中重复的名称为row的元素在尝试使用XJC解析时会产生冲突。我想知道是否有方法为每个名称附加索引,以便生成唯一的类名,例如Row1.javaRow2.javaRow3.java等。

sample.xsd

    <xsd:complexType name="table">
        <xsd:sequence>
            <xsd:element name="row" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>                   
                    <xsd:attribute name="id" type="xsd:integer"/>
                </xsd:complexType>
            </xsd:element>          
        </xsd:sequence>
    </xsd:complexType>

binding.xml

    <jxb:bindings version="2.1"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

        <jxb:bindings schemaLocation="sample.xsd">
            <jxb:globalBindings localScoping="toplevel" />
            <jxb:bindings node=".//xs:element[@name='row']" multiple="true" >
                <jxb:class name="RowXX"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>

xjc命令

    xjc -extension binding.xml sample.xsd 

我尝试使用XPath表达式但是我得到像_002f_002fXsElement_005b1_005d.java这样的垃圾输出。也许我采取的方法是错误的。欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

对于您拥有的架构,这是不可能的。你说row可以重复无限次(给定物理限制)。 xjc应生成多少个类?如果您描述的类确实是您想要的,那么您想要的架构是:

<xsd:complexType name="table">
   <xsd:sequence>
      <xsd:element name="row1" minOccurs="0">
         <xsd:complexType>
            <xsd:attribute name="id" type="xsd:integer"/>
         </xsd:complexType>
      </xsd:element>
      <xsd:element name="row2" minOccurs="0">
         <xsd:complexType>
            <xsd:attribute name="id" type="xsd:integer"/>
         </xsd:complexType>
      </xsd:element>
      <xsd:element name="row3" minOccurs="0">
         <xsd:complexType>
            <xsd:attribute name="id" type="xsd:integer"/>
         </xsd:complexType>
      </xsd:element>
      ...
   </xsd:sequence>
</xsd:complexType>

实际上,要确保row{n+1}仅在row{n}出现时出现,这是一个更复杂的事情,但你明白了。

我的感觉是:你有另一个问题要解决,你决定拥有这样的编号的类是解决那些(那些)问题的方法。如果您首先确定了这些类的原因,我们可能会找到更好的解决方案。