首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过jaxb bindings.xml区分重复元素

如何通过jaxb bindings.xml区分重复元素
EN

Stack Overflow用户
提问于 2016-02-04 08:48:55
回答 1查看 2.1K关注 0票数 0

我必须处理xsd模式才能通过jaxb生成java代码,其中一个序列中有两个相同名称的元素。这造成了麻烦,我开始使用bindings.xml来区分这两个元素。

我的问题是,我无法找到一个用于此目的的单个元素,而是将我想要的元素与另一个compleType中的另一个元素结合起来。

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?> 
<xs:schema  
    xmlns="urn:IETF:metadata:2005:FLUTE:FDT"  
    xmlns:fl="urn:IETF:metadata:2005:FLUTE:FDT"  
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mbms2005="urn:3GPP:metadata:2005:MBMS:FLUTE:FDT" 
    xmlns:mbms2007="urn:3GPP:metadata:2007:MBMS:FLUTE:FDT" 
    xmlns:mbms2008="urn:3GPP:metadata:2008:MBMS:FLUTE:FDT_ext" 
    xmlns:mbms2009="urn:3GPP:metadata:2009:MBMS:FLUTE:FDT_ext" 
    xmlns:mbms2012="urn:3GPP:metadata:2012:MBMS:FLUTE:FDT" 
    xmlns:sv="urn:3gpp:metadata:2009:MBMS:schemaVersion" 
    targetNamespace="urn:IETF:metadata:2005:FLUTE:FDT"  
    elementFormDefault="qualified" 
    version="2"> 
    <xs:import namespace="urn:3GPP:metadata:2005:MBMS:FLUTE:FDT" 
                schemaLocation="FLUTE-FDT-3GPP-2005-Extensions.xsd"/> 
    <xs:import namespace="urn:3GPP:metadata:2007:MBMS:FLUTE:FDT"  
                schemaLocation="FLUTE-FDT-3GPP-2007-Extensions.xsd"/> 
    <xs:import namespace="urn:3GPP:metadata:2008:MBMS:FLUTE:FDT_ext"  
                schemaLocation="FLUTE-FDT-3GPP-2008-Extensions.xsd"/> 
    <xs:import namespace="urn:3GPP:metadata:2009:MBMS:FLUTE:FDT_ext"  
                schemaLocation="FLUTE-FDT-3GPP-2009-Extensions.xsd"/> 
    <xs:import namespace="urn:3GPP:metadata:2012:MBMS:FLUTE:FDT"  
                schemaLocation="FLUTE-FDT-3GPP-2012-Extensions.xsd"/> 
    <xs:import namespace="urn:3gpp:metadata:2009:MBMS:schemaVersion"  
                schemaLocation="schema-version.xsd"/> 
    <xs:element name="FDT-Instance" type="FDT-InstanceType"/> 
    <xs:complexType name="FDT-InstanceType"> 
        <xs:sequence> 
            <xs:element name="File" type="FileType" maxOccurs="unbounded"/> 
            <xs:element ref="sv:schemaVersion"/>        
            <xs:element ref="mbms2012:Base-URL-1" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element ref="mbms2012:Base-URL-2" minOccurs="0" maxOccurs="unbounded"/>          
            <xs:element ref="sv:delimiter"/>         
            <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element name="Group" type="mbms2005:groupIdType" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element name="MBMS-Session-Identity-Expiry" type="mbms2005:MBMS-Session-Identity-Expiry-Type" minOccurs="0" maxOccurs="unbounded"/> 
        </xs:sequence> 
        <xs:attribute name="Expires" type="xs:string" use="required"/> 
        <xs:attribute name="Complete" type="xs:boolean" use="optional"/> 
        <xs:attribute name="Content-Type" type="xs:string" use="optional"/> 
        <xs:attribute name="Content-Encoding" type="xs:string" use="optional"/> 
        <xs:attribute name="FEC-OTI-FEC-Encoding-ID" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-FEC-Instance-ID" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Maximum-Source-Block-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Encoding-Symbol-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Max-Number-of-Encoding-Symbols" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Scheme-Specific-Info" type="xs:base64Binary" use="optional"/> 
        <xs:attribute ref="mbms2008:FullFDT" use="optional" default="false"/> 
        <xs:anyAttribute processContents="skip"/> 
    </xs:complexType> 
    <xs:complexType name="FileType"> 
        <xs:sequence> 
            <xs:element ref="mbms2007:Cache-Control" minOccurs="0"/>
            <xs:element ref="sv:delimiter"/>        
            <xs:element ref="mbms2012:Alternate-Content-Location-1" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element ref="mbms2012:Alternate-Content-Location-2" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element ref="sv:delimiter"/>         
            <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element name="Group" type="mbms2005:groupIdType" minOccurs="0" maxOccurs="unbounded"/> 
            <xs:element name="MBMS-Session-Identity" type="mbms2005:MBMS-Session-Identity-Type" minOccurs="0" maxOccurs="unbounded"/> 
        </xs:sequence> 
        <xs:attribute name="Content-Location" type="xs:anyURI" use="required"/> 
        <xs:attribute name="TOI" type="xs:positiveInteger" use="required"/> 
        <xs:attribute name="Content-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="Transfer-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="Content-Type" type="xs:string" use="optional"/> 
        <xs:attribute name="Content-Encoding" type="xs:string" use="optional"/> 
        <xs:attribute name="Content-MD5" type="xs:base64Binary" use="optional"/> 
        <xs:attribute name="FEC-OTI-FEC-Encoding-ID" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-FEC-Instance-ID" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Maximum-Source-Block-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Encoding-Symbol-Length" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Max-Number-of-Encoding-Symbols" type="xs:unsignedLong" use="optional"/> 
        <xs:attribute name="FEC-OTI-Scheme-Specific-Info" type="xs:base64Binary" use="optional"/> 
        <xs:attribute ref="mbms2009:Decryption-KEY-URI" use="optional"/> 
        <xs:attribute ref="mbms2012:FEC-Redundancy-Level" use="optional"/> 
        <xs:anyAttribute processContents="skip"/> 
    </xs:complexType> 
</xs:schema>

这是我的bindings.xml

代码语言:javascript
复制
<jxb:bindings version="2.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="FLUTE-FDT-3GPP-2005-Extensions.xsd" node="/xsd:schema">
    <jxb:bindings node="//xsd:complexType[@name='MBMS-Session-Identity-Expiry-Type']">
        <jxb:bindings node=".//xsd:attribute[@name='value']">
            <jxb:property name="requiredValue"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>
<jxb:bindings schemaLocation="mbms-flute-release11.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:complexType[@name='FileType']">
        <jxb:bindings multiple="true" node="//xs:element[2]">
            <jxb:property name="delimiter1"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

因此,第一个分隔符元素被正确地重命名为delimiter1,但schemaVersion元素也被重命名为delimiter1!

对什么问题有什么建议吗?

编辑1

在使用@ref之后,我的bindings.xml建议如下所示:

代码语言:javascript
复制
<jxb:bindings version="2.0"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="FLUTE-FDT-3GPP-2005-Extensions.xsd" node="/xsd:schema">
        <jxb:bindings node="//xsd:complexType[@name='MBMS-Session-Identity-Expiry-Type']">
            <jxb:bindings node=".//xsd:attribute[@name='value']">
                <jxb:property name="requiredValue"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    <jxb:bindings schemaLocation="mbms-flute-release11.xsd" node="/xs:schema">
        <jxb:bindings node="//xs:complexType[@name='FileType']">
            <jxb:bindings multiple="true" node="//xs:element[@ref='sv:delimiter'][1]">
                <jxb:property name="delimiter1"/>
            </jxb:bindings> 
            <jxb:bindings node="//xs:element[@ref='sv:delimiter'][2]">
                <jxb:property name="delimiter2"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

现在,它重新命名所有出现的sv:delimiter (文档中的3),而不是仅命名为FileType复杂类型的事件。它比以前更好,但我希望能够只重命名选定的元素,如果可能的话,不能全部重命名。

溶液

多亏了Xstian,这是一个行之有效的解决方案:

代码语言:javascript
复制
<jxb:bindings version="2.0"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="FLUTE-FDT-3GPP-2005-Extensions.xsd" node="/xsd:schema">
        <jxb:bindings node="//xsd:complexType[@name='MBMS-Session-Identity-Expiry-Type']">
            <jxb:bindings node=".//xsd:attribute[@name='value']">
                <jxb:property name="requiredValue"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    <jxb:bindings schemaLocation="mbms-flute-release11.xsd" node="/xs:schema">
            <jxb:bindings node="//xs:complexType[@name='FileType']//xs:element[@ref='sv:delimiter'][1]">
                <jxb:property name="delimiter1"/>
            </jxb:bindings> 
            <jxb:bindings node="//xs:complexType[@name='FileType']//xs:element[@ref='sv:delimiter'][2]">
                <jxb:property name="delimiter2"/>
            </jxb:bindings> 
    </jxb:bindings>
</jxb:bindings>

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 15:59:16

试着使用例如

代码语言:javascript
复制
<jxb:bindings schemaLocation="mbms-flute-release11.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:complexType[@name='FileType']">
        <jxb:bindings node="//xs:element[@ref='mbms2012:Alternate-Content-Location-1']">
            <jxb:property name="delimiter1"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

代码语言:javascript
复制
<jxb:bindings schemaLocation="mbms-flute-release11.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:complexType[@name='FileType']//xs:element[@ref='mbms2012:Alternate-Content-Location-1']">
          <jxb:property name="delimiter1"/>
    </jxb:bindings>
</jxb:bindings>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35196342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档