将xsd转换为java时已经定义了错误
我想将一组复杂的xsd文件转换为Java/Hibernate实体。为此, 我下载了JAXB from this link的2.2.7版本。我解压缩文件,打开cmd.exe,导航到create-marshal示例的目录,运行ant编译以确认一切正常,然后运行ant clean以消除结果以将所有内容都返回到开始条件。将xsd转换为java时已经定义了错误
当我尝试使用不同的xsd文件作为create-marshal示例的输入时,问题就出现了。特别是,当xsd文件通过更改相同标记类型的属性的值来区分数据结构时,我遇到了一个错误。所述创建-编组样品给出了在这种情况下,以下错误:
[ERROR]已定义 'POCD_MT000040.InfrastructureRoot.typeId'
[XJC]文件的管线54:/ C:/温度/ JAXB/apps/create-marshal/POCD_MT000040_SDTC.xsd
错误重复一次又一次,每次重新分配属性的值以用于不同的数据结构定义。 我该如何解决这个错误?
下面是在XSD文件中的数据结构的第一几次迭代:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema targetNamespace="urn:the-publisher:v3"
xmlns:mif="urn:the-publisher:v3/mif"
xmlns="urn:the-publisher:v3"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:sdtc="urn:the-publisher:sdtc">
<xs:annotation>
<xs:documentation>Manually edited to add Schema Extensions, July 2012</xs:documentation>
<xs:documentation>Generated using schema builder version 2.0. Stylesheets: RoseTreeToMIFStaticModel.xsl version: 1.1 StaticMifToXsd.xsl version 2.0</xs:documentation>
</xs:annotation>
<xs:complexType name="POCD_MT000040.InfrastructureRoot.typeId">
<xs:complexContent>
<xs:restriction base="II">
<xs:attribute name="root" type="uid"
use="required"
fixed="2.16.840.1.113883.1.3"/>
<xs:attribute name="extension" type="st"
use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="POCD_MT000040.Act">
<xs:sequence>
<xs:element name="realmCode" type="CS"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="typeId"
type="POCD_MT000040.InfrastructureRoot.typeId"
minOccurs="0"/>
<xs:element name="templateId" type="II"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="id" type="II" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="code" type="CD"/>
<xs:element name="text" type="ED" minOccurs="0"/>
<xs:element name="statusCode" type="CS"
minOccurs="0"/>
<xs:element name="effectiveTime" type="IVL_TS"
minOccurs="0"/>
<xs:element name="priorityCode" type="CE"
minOccurs="0"/>
<xs:element name="languageCode" type="CS"
minOccurs="0"/>
<xs:element name="subject"
type="POCD_MT000040.Subject" minOccurs="0"/>
<xs:element name="specimen"
type="POCD_MT000040.Specimen" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="performer"
type="POCD_MT000040.Performer2" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="author"
type="POCD_MT000040.Author" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="informant"
type="POCD_MT000040.Informant12"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="participant"
type="POCD_MT000040.Participant2"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="entryRelationship"
type="POCD_MT000040.EntryRelationship"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="reference"
type="POCD_MT000040.Reference"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="precondition"
type="POCD_MT000040.Precondition"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="nullFlavor"
type="NullFlavor" use="optional"/>
<xs:attribute name="classCode"
type="x_ActClassDocumentEntryAct" use="required"/>
<xs:attribute name="moodCode" type="x_DocumentActMood"
use="required"/>
<xs:attribute name="negationInd" type="bl"
use="optional"/>
</xs:complexType>
<xs:complexType name="POCD_MT000040.AssignedAuthor">
<xs:sequence>
<xs:element name="realmCode" type="CS"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="typeId"
type="POCD_MT000040.InfrastructureRoot.typeId"
minOccurs="0"/>
<xs:element name="templateId" type="II"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="id" type="II"
maxOccurs="unbounded"/>
<xs:element name="code" type="CE" minOccurs="0"/>
<xs:element name="addr" type="AD"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="telecom" type="TEL"
minOccurs="0" maxOccurs="unbounded"/>
<xs:choice>
<xs:element name="assignedPerson"
type="POCD_MT000040.Person" minOccurs="0"/>
<xs:element name="assignedAuthoringDevice"
type="POCD_MT000040.AuthoringDevice"
minOccurs="0"/>
</xs:choice>
<xs:element name="representedOrganization"
type="POCD_MT000040.Organization" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="nullFlavor"
type="NullFlavor" use="optional"/>
<xs:attribute name="classCode"
type="RoleClassAssignedEntity"
use="optional" fixed="ASSIGNED"/>
</xs:complexType>
这里有错误消息的对应的第一几个迭代:对于目标
生成序列( s)`compile'是[compile]
完整的编译顺序是[编译,javadoc,clean,run]
编译:
[echo]编译模式...
[mkdir]创建目录:C:\ Temp \ jaxb \ apps \ create-marshal \ gen-src
[mkdir]创建目录:C:\ Temp \ jaxb \ apps \ create-marshal \ GEN-SRC \底漆\ PO
[XJC]建立XJC的id为2.2.7
[XJC]的C检查时间戳:\ TEMP \ JAXB \应用\创建-编组\ POCD_MT000040_SDTC.xsd
[XJC]的输入端的最后修改时间是1409957672397
[XJC]的输出的上次修改时间-9223372036854775808
[XJC]编译的文件:/ C:/Temp/jaxb/apps/create-marshal/POCD_MT000040_SDTC.xsd
[xjc] [错误]'POCD_MT000 040.InfrastructureRoot.typeId”已定义
[XJC]文件的管线54:/ C:/Temp/jaxb/apps/create-marshal/POCD_MT000040_SDTC.xsd
[XJC]
[XJC] [ERROR](有关上述错误)的第一个定义这里出现
[XJC]文件的行46:/ C:/Temp/jaxb/apps/create-marshal/infrastructure/cda/POCD_MT000040_SDTC.xsd
[XJC]
[XJC ] [ERROR] 'POCD_MT000040.Act' 是已定义
[XJC]文件的行81:/ C:/Temp/jaxb/apps/create-marshal/POCD_MT000040_SDTC.xsd
[XJC]
.....相同的错误会重复多次,每次重复一次xs:complexType
[xjc] XJC任务失败。使用Ant -verbose开关获取更多详细信息
compile:持续时间2秒
BUILD FAILED
C:\ Temp \ jaxb \ apps \ create-marshal \ build.xml:29:无法解析架构。错误消息应在com.sun.tools.xjc.XJC2Task._doXJC(XJC2Task.java:520)
在com.sun.tools.xjc.XJC2Task.doXJC(XJC2Task.java:457)
已经提供
at com.sun.tools.xjc.XJC2Task.execute(XJC2Task.java:380)
at com.sun.istack.tools.ProtectedTask.execute(ProtectedTask.java:103)
at org.apache.tools.ant .UnknownElement.execute(UnknownElement.java:292)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
一个吨sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:606)
在org.apache.tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106)
在org.apache.tools.ant.Task.perform(Task.java:348)
在org.apache.tools.ant.Target.execute(Target.java:435)
在org.apache.tools.ant.Target.performTasks(Target.java:456)
在org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
在org.apache.tools。 ant.Project.executeTarget(Project.java:1364)
在org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
在org.apache.tools.ant.Project.executeTargets(Project.java:1248)
在org.apache。 tools.ant.Main.runBuild(Main.java:851)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher。运行(Launcher.java:280)
在org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
这里是Ant构建文件:
<?xml version="1.0" standalone="yes"?>
<!-- Copyright 2004 Sun Microsystems, Inc. All rights reserved. -->
<project basedir="." default="run">
<description>This sample application demonstrates how to use the ObjectFactory class to create a Java content tree from scratch and marshal it to XML data. It also demonstrates how to add content to a JAXB List property.</description>
<record name="build.log" loglevel="verbose" action="start"/>
<property name="jaxb.home" value="../.." />
<path id="classpath">
<pathelement path="src" />
<pathelement path="classes" />
<pathelement path="schemas" />
<fileset dir="${jaxb.home}" includes="lib/*.jar" />
</path>
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath refid="classpath" />
</taskdef>
<!--compile Java source files-->
<target name="compile" description="Compile all Java source files">
<echo message="Compiling the schema..." />
<mkdir dir="gen-src" />
<mkdir dir="gen-src/primer/po" />
<xjc schema="POCD_MT000040_SDTC.xsd" package="primer.po" destdir="gen-src">
<produces dir="gen-src/primer/po" includes="**/*.java" />
</xjc>
<echo message="Compiling the java source files..." />
<mkdir dir="classes" />
<javac destdir="classes" debug="on">
<src path="src" />
<src path="gen-src" />
<classpath refid="classpath" />
</javac>
</target>
<target name="run" depends="compile" description="Run the sample app">
<echo message="Running the sample application..." />
<java classname="Main" fork="true">
<classpath refid="classpath" />
</java>
</target>
<target name="javadoc" description="Generates javadoc" depends="compile">
<echo message="Generating javadoc..." />
<mkdir dir="docs/api" />
<javadoc sourcepath="gen-src" destdir="docs/api" windowtitle="create-marshal (formerly SampleApp3)" useexternalfile="yes">
<fileset dir="." includes="gen-src/**/*.java" excludes="**/impl/**/*.java" />
</javadoc>
</target>
<target name="clean" description="Deletes all the generated artifacts.">
<delete dir="docs/api" />
<delete dir="gen-src" />
<delete dir="schemas" />
<delete dir="classes" />
</target>
</project>
您报告的错误表明,在某种程度上,ant已被指示两次读取相同的XML模式定义。事实上,该错误消息说,一个定义在
C:\Temp\jaxb\apps\create-marshal\POCD_MT000040_SDTC.xsd
,另一项是在
...\create-marshal\infrastructure\cda\POCD_MT000040_SDTC.xsd
发现你应该清理的文件树下面创建名帅。你需要这两个中的一个,并且,relatived此文件,它所包含的那些,如:
..\coreschemas\datatypes.xsd
..\coreschemas\voc.xsd
..\coreschemas\NarrativeBlock.xsd
最后,datatypes-base.xsd
必须在同一文件夹中这三个,因为它是由datatypes.xsd
包括。
但是,当你整理完这些之后,至少在JDK 1.8附带的JAXB中会遇到另一个问题。这是在XJC的错误,通过现场“ID”的(无意)重复了一些复杂类型的触发,例如,在这里:
<xs:complexType name="POCD_MT000040.ObservationMedia">
...
<xs:element name="id" type="II" minOccurs="0" maxOccurs="unbounded"/>
...
<xs:attribute name="ID" type="xs:ID"/>
XML Schema的名字到Java名称的映射定义JAXB规范,无论产生冲突如何,都会产生错误消息(不是堆栈转储,因为它发生)。
您必须使用JAXB绑定文件进行自定义处理此问题(错误或无错误)。这里有一个(让我们称之为rename.xjb
),重命名在POCD_MT000040.ObservationMedia现场匹配@ID到`XSID
FIXES所有名称冲突ID与ID
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.1">
<bindings schemaLocation="./POCD_MT000040.xsd" node="/xs:schema">
<bindings node="//xs:complexType[@name='POCD_MT000040.ObservationMedia']/xs:attribute[@name='ID']">
<property name="xsid"/>
</bindings>
</bindings>
<bindings schemaLocation="./POCD_MT000040.xsd" node="/xs:schema">
<bindings node="//xs:complexType[@name='POCD_MT000040.RegionOfInterest']/xs:attribute[@name='ID']">
<property name="xsid"/>
</bindings>
</bindings>
<bindings schemaLocation="./POCD_MT000040.xsd" node="/xs:schema">
<bindings node="//xs:complexType[@name='POCD_MT000040.Section']/xs:attribute[@name='ID']">
<property name="xsid"/>
</bindings>
</bindings>
</bindings>
您必须添加绑定文件到xjc调用。在蚂蚁,这将是@binding
<xjc>
的:
<xjc schema="POCD_MT000040_SDTC.xsd" binding="rename.xjb" ...
There * *可能是40,甚至50,但实际上只有三个。只需遵循以下模式:复制并替换complexType的名称。它将比我花费更少的时间搜索和下载XML Schema文件,追踪问题并修复它们,以便成功编译。 – laune 2014-09-06 13:31:24
对不起,编辑错误延迟了绑定文件的外观。现在确实应该可以。 – laune 2014-09-06 16:45:51
PurchaseOrderType,USAddress(不是USName)和Item是JAXB示例中重复使用的类型。你不能从那里使用C:\ Temp \ jaxb \ apps \ create-marshal \ src \ Main.java;你将不得不编写自己的Java代码来做一些对象树创建和编组(或者反过程,不管)。 – laune 2014-09-08 05:51:48
我已创建'[JIRA](JAXB-1037)'。看起来只有“abc”和“ABC”形式(全部较低,全部大写)的重复结果导致这个特定的错误/内部错误导致IllegalArgumentException。其他重复的字段名称(例如“abc”和“ABc”)被正确诊断为错误。 – laune 2014-09-06 14:27:11
有三个复杂类型带有“id”和属性ID。只有这三个导致问题。 **我已经添加了完整的xjb,修复了我的答案。** ---忘记JIRA:这仅仅适用于那些偶然发现Q并认为应该提出问题的人,所以他们不会重复。 – laune 2014-09-06 15:48:50
我希望现在一切都清楚:完整的绑定文件,使用xjc编译时没有错误。 – laune 2014-09-06 15:55:00