我正在尝试为XBRL中定义的类型生成Java类.
我的构建过程基于Maven 2,这是我的试验.我只粘贴build
部分,它依赖于一些属性:
package
是我的目标包的名称
catalog
是目录的路径和文件名.因为我没有互联网连接,我有amny条目,但我认为这些都是必要的
-- TR9401 for XBRL resources --
SYSTEM http://www.xbrl.org/2003/XLink http/www.xbrl.org/2003/xl-2003-12-31.xsd
SYSTEM http://www.w3.org/1999/xlink http/www.xbrl.org/2003/xlink-2003-12-31.xsd
Run Code Online (Sandbox Code Playgroud)
xsd.path
是XSD所在的目录
xsd.file
是以下极简主义XSD的文件名
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://www.xbrl.org/2003/instance"
schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
我试过的所有插件都无法导入xl:nonEmptyURI
.
但是xl
映射到http://www.xbrl.org/2003/XLink
(在我的目录中)哪个导入 <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink-2003-12-31.xsd"/>
定义 nonEmptyURI
怎么了?我该如何解决?
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<xsdOptions>
<xsdOption>
<catalog>${catalog}</catalog>
<xsd>${xsd.path}/${xsd.file}</xsd>
<packagename>${package}</packagename>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
失败了
parsing a schema...
[ERROR] src-resolve: Cannot resolve the name 'xl:nonEmptyURI' …
Run Code Online (Sandbox Code Playgroud) jaxb xbrl maven-jaxb2-plugin jaxb2-maven-plugin cxf-xjc-plugin
所以这是我的问题.我给了一个我生成的XML文件应符合的XSD.使用org.apache.cxf.cxf-xjc-plugin
maven插件和外部绑定文件,我生成源代码.但是当我在尝试编组我的对象时,生成的XML不符合我的要求.
我的XSD包含以下内容:
<xsd:element maxOccurs="1" minOccurs="0" name="amount">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="13" />
<xsd:fractionDigits value="2" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
<xsd:element maxOccurs="1" minOccurs="0" name="rate">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="8" />
<xsd:fractionDigits value="5" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)
生成的XML片段如下所示:
<amount>109.5</amount>
...
<rate>10.25</rate>
Run Code Online (Sandbox Code Playgroud)
虽然我期待它是:
<amount>109.50</amount>
...
<rate>10.25000</rate>
Run Code Online (Sandbox Code Playgroud)
有没有办法以干净的方式解决这个问题?
我不想为每一个写几个适配器totalDigits
,fractionDigits
组合.由于XSD可能会发生变化,因此我希望保持生成的源代码不变.
我需要一个包含来自多个模式的多个 java 对象的 ObjectFactory。我对几个不同的插件和这些插件的变体的运气都是零。目前我正在使用以下内容:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>2.6.2</version>
<configuration>
<extensions>
<extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.6.2</extension>
</extensions>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<sourceRoot>${basedir}/target/generated-sources/xjc</sourceRoot>
<xsdOptions>
<xsdOption>
<xsd>${basedir}/src/main/resources/osds/schemas/IataAsmAdmEvent.xsd</xsd>
<xsd>${basedir}/src/main/resources/osds/schemas/IataAsmCnlEvent.xsd</xsd>
<xsd>${basedir}/src/main/resources/osds/schemas/IataAsmEqtEvent.xsd</xsd>
<packagename>com.mypackage</packagename>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
使用此插件和许多其他插件,我只能生成仅包含列表中最后一个架构的 ObjectFactory。以前的 xsd 都没有在 OF 中作为 java 对象。谁能帮我解决这个问题吗?
谢谢!
为了从XSD生成Java类(用于读取XML文件),我们使用了jaxb2-maven-plugin和Java8。
对于Java 11,我们遇到了很多问题...
哪些库和插件可以工作(今天),从而允许使用Java 11和Maven从XSD生成Java代码?如果可能,请指出不同的解决方案,例如使用cxf-xjc-plugin,jaxb2-Maven-Plugin和其他解决方案。
我将一个项目从 迁移Java 8
到Java 11
,并且在XSD
使用生成代码时遇到了一些麻烦cxf-xjc-plugin.
即使我确实升级到了cxf-xjc-plugin
版本3.3.0
,在构建项目时仍然遇到异常
我的pom.xml
...
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<extensions>
<extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>
</extensions>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<sourceRoot>${basedir}/target/generated-sources/xjc</sourceRoot>
<xsdOptions>
<xsdOption>
<xsd>src/main/resources/xsd/leehwak.xsd</xsd>
<packagename>fr.lee.hwak.batch.input</packagename>
<extensionArgs>
<arg>-encoding</arg>
<arg>UTF-8</arg>
</extensionArgs>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
[ERROR] C:\Users\Achraf\IdeaProjects\lee\lee-batch\target\null [-1:-1]: Failed to create model
com.sun.istack.SAXParseException2; Failed to create model
at com.sun.tools.xjc.ErrorReceiver.error(ErrorReceiver.java:64)
at org.apache.cxf.maven_plugin.XSDToJavaRunner.loadModel(XSDToJavaRunner.java:241)
at org.apache.cxf.maven_plugin.XSDToJavaRunner.run(XSDToJavaRunner.java:177)
at org.apache.cxf.maven_plugin.XSDToJavaRunner.main(XSDToJavaRunner.java:375)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at …
Run Code Online (Sandbox Code Playgroud) 假设我有 2 个 xsd-s。第一个声明类型 A。第二个导入第一个 xsd(导入命名空间、xmlns:ns=... 等)并声明类型 B,该类型扩展了类型 A (base="ns:B")。像这样:
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="A">
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation=".\XSD1.xsd" />
<xs:simpleType name="B">
<xs:restriction base="A" />
</xs:simpleType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
我使用 cxf-xjc maven 插件进行代码生成,配置如下:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf.version}</version>
<configuration>
<extensions>
<extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:${cxf.version}</extension>
</extensions>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<xsdOptions>
<xsdOption>
<xsd>src/main/resources/XSD1.xsd</xsd>
<packagename>org.example</packagename>
</xsdOption>
<xsdOption>
<xsd>src/main/resources/XSD2.xsd</xsd>
<packagename>org.example.child</packagename>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我想将父类和子类生成到单独的包中,但是这样 XJC将父类生成到我不想要的两个包中。
是否可以告诉 JAXB/XJC 不要这样做,而只创建一个父类 (A) 并从子类 (B) 中的另一个包导入它?
我正在使用 cxf-xjc 插件来生成 Java 类。这是成功生成 Java 类的 xjc 命令。
xjc -d C:\Users\abc\devEnv\VcloudJavaClasses -catalog C:\Users\abc\devEnv\schema-files\schemas\external\catalog.xml -b C:\Users\abc\devEnv\schema-files\ 1.5\schemas\vcloud\vcloud.xjb -b C:\Users\abc\devEnv\schema-files\1.5\schemas\vcloud\ovf.xjb -b C:\Users\abc\devEnv\schema-files\1.5\ schemas\extension\vmwextensions.xjb C:\Users\abc\devEnv\schema-files\1.5\schemas\master\master.xsd C:\Users\abc\devEnv\schema-files\1.5\schemas\extension\vmwextensions。 xsd -nv
我正在尝试将此 xjc 命令映射到 cxf-xjc 插件。
但我收到以下错误。
[错误] 无法在项目 vcloud-training 上执行目标 org.apache.cxf:cxf-xjc-plugin:2.3.0:xsdtojava (default-cli):必须指定 xsdOptions -> [帮助 1]
这是关于插件的 pom 部分。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>2.3.0</version>
<configuration>
<extensions>
<extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>
</extensions>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<sourceRoot>C:\Users\abc\devEnv\schema-files-pom</sourceRoot>
<xsdOptions>
<xsdOption>
<xsd>C:\Users\abc\devEnv\schema-files\1.5\schemas\master\master.xsd</xsd>
<xsd>C:\Users\abc\devEnv\schema-files\1.5\schemas\extension\vmwextensions.xsd</xsd>
<bindingFile>classpath:/schemas/wsdl/http.xjb</bindingFile>
<bindingFile>C:\Users\abc\devEnv\schema-files\1.5\schemas\vcloud\vcloud.xjb</bindingFile>
<bindingFile>C:\Users\abc\devEnv\schema-files\1.5\schemas\vcloud\ovf.xjb</bindingFile>
<bindingFile>C:\Users\abc\devEnv\schema-files\1.5\schemas\extension\vmwextensions.xjb</bindingFile>
<catalog>C:\Users\abc\devEnv\schema-files\schemas\external\catalog.xml</catalog>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
配置有什么问题所以我收到这个错误?
我无法使用cxf-xjc-plugin将响应xml映射到xsd生成的java.
的pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>2.3.0</version>
<configuration>
<extensions>
<extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>
</extensions>
</configuration>
<executions>
<execution>
<id>generate-sources-trans</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<sourceRoot>${basedir}/src/main/java</sourceRoot>
<xsdOptions>
<xsdOption>
<xsd>src/main/resources/Response.xsd</xsd>
<packagename>com.test.response</packagename>
<extensionArgs>
<extensionArg>-Xdv</extensionArg>
</extensionArgs>
</xsdOption>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
Response.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:automatedIDgenerationResponse" xmlns:tns="urn:automatedIDgenerationResponse" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- definition of simple elements -->
<complexType name="generatedIDs">
<sequence>
<element name="idType" type="string"/>
<element name="id" type="string"/>
</sequence>
</complexType>
<element name="automatedIDgenerationResponse" type="tns:automatedIDResponse"/>
<complexType name="automatedIDResponse">
<sequence>
<element name="requestID" type="string" nillable="false"/>
<element name="status" type="string" nillable="false"/>
<element name="errorCode" …
Run Code Online (Sandbox Code Playgroud)