0

(我已经用谷歌搜索并在这里进行了搜索,但没有找到答案,也许我使用了错误的关键字......)

为了简单起见,我有两个模式:

a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="http://foo.bar/something" 
  targetNamespace="http://foo.bar/something" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified">

  <xs:complexType name="TFoo">
    <xs:attribute name="version" type="xs:string" />
  </xs:complexType>
</xs:schema>

b.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="http://foo.bar/something" 
  targetNamespace="http://foo.bar/something" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified">

  <xs:complexType name="TFoo">
    <xs:attribute name="version" type="xs:string" />
    <xs:attribute name="dateTime" type="xs:dateTime" />
  </xs:complexType>
</xs:schema>

两者都有相同的 targetNamespace和一个名为TFoo的 complexType 。

我有一个外部绑定来将a.xsd的生成类名从TFoo 更改TFooA

a-binding.xml

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

  <jxb:bindings schemaLocation="a.xsd">
    <jxb:bindings node="//xs:complexType[@name='TFoo']">
      <jxb:class name="TFooA"/>
    </jxb:bindings>
  </jxb:bindings>

</jxb:bindings>

如果我单独编译a.xsd 则有效:

$ xjc -b a-binding.xml a.xsd 
parsing a schema...
compiling a schema...
bar/foo/something/ObjectFactory.java
bar/foo/something/TFooA.java
bar/foo/something/package-info.java

(看看我是如何得到TFoo A .java的)

但是,如果我尝试一次编译两个模式,我会得到:

$ xjc -b a-binding.xml a.xsd b.xsd 
parsing a schema...
[ERROR] 'TFoo' is already defined
  line 13 of file:/home/scherrer/tmp/PL_008f/b.xsd

[ERROR] (related to above error) the first definition appears here
  line 9 of file:/home/scherrer/tmp/PL_008f/a.xsd

Failed to parse a schema.

我知道TFoo被定义了两次,这就是为什么我有外部绑定来解决冲突。

观察。两种模式都是虚构的,是为了举例说明问题而编写的,真实的(很多)是由第三方提供的,我无法更改它们。

谁能告诉我这是某种 xjc 限制(此处未列出)还是根本不应该工作?或者可能是一个错误?

提前致谢。

4

2 回答 2

2

有 2 个不同的模式文档定义相同的名称空间(甚至更糟 - 相同的元素)相当于让 2 个不同的 jar 包含相同的包和包中的相同类。这不是 jaxb 本身的限制 - 它违反了模式名称空间的含义。

简而言之,您不能一起处理这些模式。

生成器无法创建类,因为它不知道要引用什么。失败发生在您尝试重命名之前。它在读取模式时发生。

您可以做的是分别处理模式并更改使用的 java 包名称。这避免了 java 包空间中的命名冲突,并且基本上将模式文档视为完全独立的实体,彼此之间没有引用。这可以通过定义要在绑定中使用的包名称来完成:

<jxb:bindings 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  version="2.1">
    <jxb:bindings schemaLocation="a.xsd" node="/xs:schema">
      <jxb:schemaBindings>
        <jxb:package name="com.foo.a"></jxb:package>
      </jxb:schemaBindings>
    </jxb:bindings>
</jxb:bindings>
于 2015-01-07T14:20:01.080 回答
-1

我认为您发现了数据绑定的限制。改用数据投影披露:我隶属于该项目)。您的架构 b.xsd 看起来就像对 a.xsd 的扩展。您可以创建适合 b.xsd 的投影界面,并将其与适合 a.xsd 或 b.xsd 的任何文档一起使用。

于 2015-01-08T07:27:43.630 回答