这个官方Xml模式是无效的还是Jaxb的错误限制?



uPnP定义了许多Xml模式,包括didl-lite。Xsd,包括以下部分:

<xsd:sequence>
<xsd:element ref="dc:title"/>
<xsd:group ref="didl-lite:allowed-under-container" minOccurs="0" maxOccurs="unbounded"/>
<xsd:group ref="upnp:class.group"/>
<xsd:group ref="didl-lite:allowed-under-container" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>

当我尝试使用jaxb从这个构建Java类时,它会报错

删除第二个xsd:group ref="didl-lite:allowed-under-container"minOccurs ="0";maxOccurs ="unbounded">行,所以我们有

<xsd:sequence>
<xsd:element ref="dc:title"/>
<xsd:group ref="didl-lite:allowed-under-container" minOccurs="0" maxOccurs="unbounded"/>
<xsd:group ref="upnp:class.group"/>
</xsd:sequence>

修复了这个问题,并且看起来更有意义。

但我不清楚是Xsd实际上无效还是这只是从Xsd生成Jaxb类的限制?

我认为所提供的模式在语义和形式上都是有效的。

例如,您可以使用Java或在线(例如,在此站点)验证模式的格式是否良好。

您面临的问题可以被认为是JAXB的一种限制。

限制在于生成器遇到了一个在生成类的过程中已经考虑过的值,并且它有一个问题,因为它将无法为第二个值生成属性和相应的相关方法和东西,因为名称已经被占用了。

我将使用xjc工具进行代码生成,但解决方案也应该可移植到Maven或Gradle插件。

如果您像这样运行xjc工具:

xjc -d out didl-lite-v2.xsd

错误描述会给你一个可能的解决方案:

[ERROR] Property "AllowedUnderItem" is already defined. Use <jaxb:property> to resolve this conflict

提到的术语<jaxb:property>与JAXB XML绑定有关。

JAXB XML绑定允许您以不同的方式定制JAXB Java类生成过程。

必要的配置在一个XML文件中提供了一定的信息。

在这个特定的用例中,您可以定义以下绑定XML文件,我们将其命名为binding.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="didl-lite-v2.xsd">
<jaxb:bindings
node="//xsd:complexType[@name='container.type']/xsd:sequence/xsd:group[@ref='didl-lite:allowed-under-container'][2]">
<jaxb:property name="allowedUnderContainerAfterUpnpClassGroup"/>
</jaxb:bindings>
<jaxb:bindings
node="//xsd:complexType[@name='item.type']/xsd:sequence/xsd:group[@ref='didl-lite:allowed-under-item'][2]">
<jaxb:property name="allowedUnderItemAfterUpnpClassGroup"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

可以看到,我们指示第二次出现的allowed-under-itemgroup(由XPath表达式//xsd:complexType[@name='item.type']/xsd:sequence/xsd:group[@ref='didl-lite:allowed-under-item'][2]表示)应该被视为allowedUnderItemAfterUpnpClassGroup。我们需要对allowed-under-container做类似的事情。

然后,如果您再次运行传入此XML绑定文件的xjc工具,您的类将成功生成:

xjc -d out -b binding.xml didl-lite-v2.xsd

这个或那个SO问题也可能有所帮助。

相关内容

最新更新