1

在我公司的一个项目中,我正在构建一个非常简单的业务流程引擎。为此,我从 BPMN 开始,现在我正在深入研究 XPDL。我从http://www.xpdl.org/下载了 XPDL xsd,并尝试使用 xjc 及其包装 eclipse 插件从这个 xsd 生成类。它失败,因为如下所示的冲突错误

parsing a schema...
[ERROR] Property "TimeDate" is already defined. Use <jaxb:property> to resolve this conflict.
  line 3558 of file:/home/alberto/Job/WSP/orch/orch.model/src/main/resources/bpmnxpdl_40a.xsd

老实说我不知道​​1)为什么像这样的官方和标准xsd会出现这种问题2)如何解决?

4

1 回答 1

0

问题

如果您检查TriggerTime元素,您会看到有一个元素和属性称为TimeDate. 这在 XML 中不是问题,但默认情况下,JAXB 实现会尝试将这两个项目映射到导致冲突的同一个 Java 属性。

<xsd:element name="TriggerTimer">
    <xsd:annotation>
        <xsd:documentation>BPMN: If the Trigger Type is Timer then this must be present</xsd:documentation>
    </xsd:annotation>
    <xsd:complexType>
        <xsd:sequence>
            <xsd:choice>
                <xsd:element name="TimeDate" type="xpdl:ExpressionType"/>
                <xsd:element name="TimeCycle" type="xpdl:ExpressionType"/>
            </xsd:choice>
            <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="TimeDate" type="xsd:string" use="optional">
            <xsd:annotation>
                <xsd:documentation>Deprecated</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="TimeCycle" type="xsd:string" use="optional">
            <xsd:annotation>
                <xsd:documentation>Deprecated</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:complexType>
</xsd:element>

解决方案 (binding.xml)

外部绑定文件可用于自定义 JAXB 实现如何生成从 XML 模式建模的 Java。下面是一个重命名生成的属性之一的示例:

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

    <jxb:bindings schemaLocation="bpmnxpdl_40a.xsd">
        <jxb:bindings node="//xsd:element[@name='TriggerTimer']/xsd:complexType/xsd:attribute[@name='TimeDate']">
            <jxb:property name="timeDateAttr"/>
        </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

XJC 呼叫

-b选项用于在使用 XJC 实用程序时指定绑定文件。

xjc -b binding.xml bpmnxpdl_40a.xsd
于 2012-09-16T19:03:27.410 回答