2014-09-06 72 views
1

我想將一組複雜的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> 
+0

我已創建'[JIRA](JAXB-1037)'。看起來只有「abc」和「ABC」形式(全部較低,全部大寫)的重複結果導致這個特定的錯誤/內部錯誤導致IllegalArgumentException。其他重複的字段名稱(例如「abc」和「ABc」)被正確診斷爲錯誤。 – laune 2014-09-06 14:27:11

+0

有三個複雜類型帶有「id」和屬性ID。只有這三個導致問題。 **我已經添加了完整的xjb,修復了我的答案。** ---忘記JIRA:這僅僅適用於那些偶然發現Q並認爲應該提出問題的人,所以他們不會重複。 – laune 2014-09-06 15:48:50

+0

我希望現在一切都清楚:完整的綁定文件,使用xjc編譯時沒有錯誤。 – laune 2014-09-06 15:55:00

回答

2

您報告的錯誤表明,在某種程度上,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" ... 
+0

There * *可能是40,甚至50,但實際上只有三個。只需遵循以下模式:複製並替換complexType的名稱。它將比我花費更少的時間搜索和下載XML Schema文件,追蹤問題並修復它們,以便成功編譯。 – laune 2014-09-06 13:31:24

+0

對不起,編輯錯誤延遲了綁定文件的外觀。現在確實應該可以。 – laune 2014-09-06 16:45:51

+0

PurchaseOrderType,USAddress(不是USName)和Item是JAXB示例中重複使用的類型。你不能從那裏使用C:\ Temp \ jaxb \ apps \ create-marshal \ src \ Main.java;你將不得不編寫自己的Java代碼來做一些對象樹創建和編組(或者反過程,不管)。 – laune 2014-09-08 05:51:48

相關問題