当前位置: 首页 > 知识库问答 >
问题:

将xsd转换为java时已定义错误

戴品
2023-03-14

我想把一组复杂的xsd文件转换成Java/Hibernate实体。为此,我从这个链接下载了JAXB的2.2.7版本。解压文件,打开cmd.exe,导航到create-marshal示例的目录,运行ant compile以确认一切正常,然后运行ant clean以消除结果,将一切返回到启动条件。

当我试图使用不同的xsd文件作为create-marshal示例的输入时,问题出现了。具体地说,当xsd文件通过更改相同标记类型的属性值来区分数据结构时,我会得到一个错误。在这种情况下,create-marshal示例给出了以下错误:

<?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>

以下是错误消息的前几次迭代:

目标的构建序列`compile'是[compile]
完整的构建序列是[compile,javadoc,clean,run,]
compile:
[echo]编译架构...
[mkdir]创建dir:C:\temp\jaxb\apps\create-marshal\gen-src
[mkdir]创建dir:C:\temp\jaxb\apps\create-marshal\gen-src\primer\po
[xjc]xjc的构建id是2.2.7
[xjc]检查sdtc.xsd
[xjc]输入的最后修改时间是1409957672397
[xjc]输出的最后修改时间是-9223372036854775808
[xjc]编译文件:/c://temp/jaxb/apps/create-marshal/pocd_mt000040_sdtc.xsd
[xjc][ERROR]'pocd_mt000040.infrastructureroot.typeid'已定义
[xjc]文件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]文件:/c://temp/jaxb/apps/create-marshal/pocd_mt000040_sdtc.xsd
[xjc]第81行

....相同的错误重复多次,每次重复xs:complextype一次

[xjc]xjc任务失败。有关详细信息,请使用Ant-verbose开关
compile:duration 2 seconds
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)
在com.sun.tools.xjc.xjc2task.doxjc(xjc2task.java:457)
在com.sun.tools.xjc.xjc.task.execute(xjc2task.java:380)
accessorimpl.invoke0(原生方法)在sun.reflect.nativeMethodAccessorImpl.invoke(nativeMethodAccessorImpl.java:57)
在sun.reflect.delegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:606)
在get.execute(Target.java:435)
在org.apache.tools.ant.target.performTasks(Target.java:456)
在org.apache.tools.ant.Project.executeSortedTargets(项目).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 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>

共有1个答案

马丰
2023-03-14

您报告的错误表明,不知何故,ant被指示读取相同的XML模式定义两次。实际上,错误消息说一个定义

C:\Temp\jaxb\apps\create-marshal\POCD_MT000040_SDTC.xsd

另一个是在

...\create-marshal\infrastructure\cda\POCD_MT000040_SDTC.xsd

您应该清理create-marshal下面的文件树。您需要这两个文件中的一个,并且,与此文件相对应的是它所包含的那些,例如:

..\coreschemas\datatypes.xsd
..\coreschemas\voc.xsd
..\coreschemas\NarrativeBlock.xsd
<xs:complexType name="POCD_MT000040.ObservationMedia">
    ...
    <xs:element name="id" type="II" minOccurs="0" maxOccurs="unbounded"/>
    ...
  <xs:attribute name="ID" type="xs: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调用中。在ant中,这将是 @binding:

<xjc schema="POCD_MT000040_SDTC.xsd" binding="rename.xjb" ...
 类似资料:
  • 我的customer.xsd如下所示。我正试图将它转换为pojo类schema_reference.4:未能读取模式文档“xml.xsd”,因为 1)找不到文件; 2)文件无法阅读; 3)文档的根元素不是。 我正在使用maven将XSD转换为Java clases。

  • 我正在尝试使用JAXB将我无法控制的XSD转换为Java类。我得到的错误是: XSD中包含错误的代码位于: 具体来说,它是使用布尔类型加密的属性。布尔类型定义为 从四处搜索来看,这似乎是一个比较常见的情况。从我可以看出,mxencrypted行中的默认值不应该是1?当我将XSD加载到液态XML中时,模式不会报告错误。在这里验证XSD(http://www.utilities-online.info

  • 问题内容: 我只想知道是否有一个程序可以像 JAXB for Java那样将XSD文件转换为Python类? 问题答案: generateDS:我认为这是我需要的好工具 编辑:实际上,generateDS做得很好!它使用所有方法(setter和getter,导出到XML,从XML导入)生成Python类。效果很好!

  • 问题内容: 我正在使用Java openCV,并且尝试加载照片并运行与之匹配的模板。模板匹配方法处理Mat对象,因此我需要加载图像并将其转换为Mat。 我这样做的方式是: 这样,我从Android SD卡加载了一张照片,并尝试使用openCV方法bitmapToMat将其转换为Mat对象。问题是在转换时,应用程序崩溃。 这是LogCat: 我不知道我做错了什么,还是只是有问题的openCV。 谢谢

  • 如何将XSD 1.1模式自动转换为XSD 1.0模式,方法是去掉所有1.1功能,只保留与XSD 1.0兼容的子集? 我意识到这将限制您可以利用多少XSD 1.1功能,但是我想象的用例是一个模式,您可以发布XSD 1.1版本和更兼容的XSD 1.0版本,两者都描述相同的数据结构但是1.1版本有一些额外的

  • 问题内容: 我在函数上发现错误,从DatatypeFactory df初始化newInstance()方法后,它显示错误结果,我得到了另一个错误: 我只是将包裹名称从 然后投射: 问题答案: 这是不可能的 投 自到。您需要从一种类型 转换 为另一种类型: