当前位置: 首页 > 知识库问答 >
问题:

防止从没有命名空间的XSD生成重复类

彭胡媚
2023-03-14

我目前正在使用JAXB使用Mojo Maven插件'jaxb2-maven-plugin'生成的类为我们的Netbeans平台应用程序实现功能。不幸的是,XSD文件的创建不在我手中,它们是机密的。我试图提供一个最小的运行示例来进一步证明这一点,但现在我希望有人可以仅从我的描述中将我推向正确的方向。

我们有很多XSD文件,在过去的几周里得到了一些补充。其中两个XSD(我们称之为A.xsd和B.xsd)包括另一个XSD(我们称之为common.xsd),其中包含其他两个XSD使用的通用类型。 这个common.xsd没有命名空间,这应该保持这种状态。

这就产生了以下问题:对于在common.xsd中定义的类型,xjc会生成三个副本。一个驻留在名为“generated”的包中(正是我想要使用的类),另外两个驻留在A.xsd和B.xsd的包中,这两个包与“generated”中的类基本相同,只是有几个名称空间是我不需要的。

我从阅读Stackoverflow上的一些其他问题中了解到,剧集可以解决这个问题,但我不能让它与没有名称空间的XSD一起工作。

我在POM中的插件配置非常简单:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <configuration>
        <npa>true</npa>
    </configuration>
    <executions>
       <execution>
            <goals>
                <goal>xjc</goal>
            </goals>
       </execution>
    </executions>
</plugin>

有没有一个解决这个问题的方法是使用特殊配置的剧集,或者我可以使用某种绑定来解决这个问题?

共有1个答案

陆晓博
2023-03-14

不幸的是,这是对剧集失败原因的解释,而不是对你问题的回答。

您可以使用< code>jaxb:class/@ref绑定将您的模式类型映射到某个现有的类上。参见布莱斯的这篇文章。

简而言之,你可以这样做:

<jaxb:binding node="...point to your type here">
    <jaxb:class ref="ExistingClass"/>
<jaxb:binding>

在这种情况下,Existingclass将被重用于您的类型。

您正在尝试使其适用于剧集。剧集,本质上正是一组这样的映射。但是剧集使用 SCD(架构组件指示符)来指向类型,而不是带有 XPath-表达式的节点。SCD 是命名空间驱动的。如果你没有命名空间 - 或者,更好地说 - 你有变色龙命名空间设计,那么你没有正确的命名空间。因此,情节失败。

问题是你的“公共”类应该使用“主机”模式的名称空间(这就是变色龙设计的目的)。名称空间和本地名称实际上在注释中提供。如果只有一组类和一组注释,那么就只有一个名称空间。因此,目前我还没有找到一种简单的方法来创建一组“公共”类。

如果您可以单独使用AB,也就是说,不要同时在同一上下文中,那么就可以欺骗注释阅读器为公共使用指定的命名空间。

但如果你想同时使用A和B,我真的不知道该怎么做。也许你可以为<code>common</code>创建一个命名空间,然后应用一些预处理,用这个命名空间替换a和B中公共元素的命名空间。。。

所以这不是一个回答,更多的是对背景的阐述。

 类似资料:
  • 我有两套XSD,一套用于入站操作,另一套用于出站操作。这两个XSD集具有相似的名称空间,但由于它们来自不同的源,因此需要在同一代码集中分别维护它们。每个XSD集合都有深度嵌套的类,并生成大约650个类。我正在使用Maven JAXB插件生成Java类 如果我指定了

  • 尝试基于两个唯一的字符串生成客户端Id。这应该与服务器中从相同的ID生成的UUID相同。 使用Javascript,它看起来像这样: 似乎找不到在Swift上生成这个的方法,NSUUID只能从无到有生成UUID 我正在寻找这样的东西: 编辑 例:

  • 我正在使用JAXB生成用于编组/解组XML的类。问题是父类的命名空间仅适用于XML中的父元素,而不适用于JAXB注释类中使用的子类。 我不知道我犯了什么错误。下面是我的xsd和xml以及类。 XSD: 项目Responses.xsd JAXB类 项目响应.java 项目响应.java Money.java XML输出: 包信息。java有以下条目 货币类别不在同一个包中。如何将其包含在 Jaxb

  • 背景:我正在尝试将WSDL/XSD转换为Java类 问题:生成的包名称与命名空间不匹配。数字命名空间的最后一部分丢失,包中缺少02以下的部分 XSD已经-xmlns=“urn:iso:std:iso:20022:tech:XSD:pain.001.001.02” Java类生成——包iso。标准iso_20022.tech.xsd。疼痛001 001; 采取的步骤: 我尝试了2个maven插件,两

  • 我无法使用下面的XSD验证XML, XSD数据 我在用XML验证这个XSD时遇到以下错误, cvc复合型。2.4.答:发现以元素“standardHeader”开头的内容无效。应为“{standardHeader}”之一。 如何提供此标签:

  • 如果我删除所有命名空间和前缀,我的XSLT转换将完美运行。 我曾尝试过几次引入名称空间,但最终总是出现某种错误或没有输出,因此我在这里寻求一些帮助和理解。 我的预期输出,缩减为命名空间和前缀,是: 再次缩减的XML输入是: 为了实现正确的命名空间转换,我需要向XSLT头中添加什么?