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-item
group
(由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问题也可能有所帮助。