java - 这个官方 Xml 模式是否无效或者是 Jaxb 的错误限制

标签 java xml xsd jaxb upnp

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 或在线验证架构的格式是否正确,例如,在 this site 中.

您面临的问题可以被认为是 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 bindings 有关.

JAXB XML 绑定(bind)允许您以不同的方式自定义 JAXB Java 类生成过程。

必要的配置在带有特定信息的 XML 文件中提供。

在此特定用例中,您可以定义以下绑定(bind) 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 做类似的事情.

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

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

Thisthis other SO 问题也可能有所帮助。

关于java - 这个官方 Xml 模式是否无效或者是 Jaxb 的错误限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72449003/

相关文章:

android - Cardview 内容似乎没有正确加载或充气,没有错误

java - CardView 未以编程方式添加到 LinearLayout

xml - XSD:如何将 'unique' 和 'key'/'keyref' 与元素值一起使用?

java - 为 CXF Web 服务生成 XSD

java - 打开文件并删除java中的第一个单词

java - jackson 制作 cookie

java - 解析运行日志

java - while 和 for 循环在计算上有什么区别吗?

java - 您推荐使用哪个包来用 Java 解析 XML 和 JSON?

xml - XSD 中的无序元素具有强制性和无界元素?