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

当我想使用jaxb2生成xsd文件时,如何为所有java类指定相同的命名空间?

姬选
2023-03-14

我有一个XML文件来配置程序。XML配置是用jaxb解组的。我认为从这些类生成一个XSD文件会很有用,这样其他开发人员就更容易更改设置并避免错误。

可以使用没有命名空间的XSD文件,但jaxb2后处理工具不起作用(我坚持使用名称“schema1.xsd”,无法在创建时更改它)。

下面您可以看到如何在没有命名空间的情况下将XSD文件“导入”到您的XML文件中:

<rootTag
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="file:///C:/path/to/the/file/schema1.xsd">
<subTags>
</subTags>
</rootTag>

我发现一些博客说应该给< code>@XmlRootElement添加一个名称空间,比如`@ xmlroot element(namespace = " my namespace "),但是当我的类使用了其他类的实例时,我该怎么办呢?

下面你可以看到我的类的简化:

@XmlRootElement(name = "library")
@XmlAccessorType(XmlAccessType.FIELD)
public class Library {
    // creates a wrapper around a List
    @XmlElementWrapper(name = "books")
    // lists this tag
    @XmlElement(name = "book")
    private List<Book> books = new ArrayList<>();

    private Address address;

    private String nameOfLibrary;
@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
    private String title;
    private String author;
}
@XmlRootElement(name = "address")
@XmlAccessorType(XmlAccessType.FIELD)
public class Address {
    private String street;
    private String town;
}

当我只将命名空间添加到我的第一个类(库)时,jaxb会为库生成一个schema1.xsd文件.java该命名空间将导入第二个XSD文件schema2.xsd,其中包含所有其他对象。

当我将namepcae添加到每个XmlRootElement和XmlElement时,schema2.xsd和schema1.xsd之间仍然存在分离。

下面您可以看到插件设置:

<plugins>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>schemagen</id>
            <goals>
                <goal>schemagen</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <sources>
            <source>src/main/java/de/soptim/za/tools/backup/checking/config</source>
        </sources>
        <outputDirectory>src/main/resources/schema</outputDirectory>
        <clearOutputDir>false</clearOutputDir>
    </configuration>
</plugin>
</plugins>
<dependencies>
<dependency>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.5.0</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>3.0.0</version>
</dependency>
</dependencies>

也许我也误解了名称空间的概念,我现在很困惑。

共有1个答案

徐涵亮
2023-03-14

我假设您的JAXB注释类(LibraryAddressBook)都在一个公共包中,它似乎是de.soptim.za.tools.backup.checking.config。然后您可以放置<code>包信息。将java文件放入这个包中,用<code>@XmlSchema

@XmlSchema(namespace = "http://mynamespace.com",
           elementFormDefault = XmlNsForm.QUALIFIED,
           attributeFormDefault = XmlNsForm.UNSET)
package de.soptim.za.tools.backup.checking.config;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

另请参见@XmlSchema的API文档和此相关问题。

对于编组/解编组,此命名空间将应用于该包的所有JAXB类(当然,在类中的任何单个<code>@XmlElement、<code>@XmlElementWrapper、<code>@XmlAttribute或<code>@XmlRootElement注释中显式设置另一个命名空间的情况除外)。

当从这个包的类生成模式时,您应该只生成一个XSD文件,因为您的类只使用一个命名空间。

 类似资料:
  • 我有两套XSD,一套用于入站操作,另一套用于出站操作。这两个XSD集具有相似的名称空间,但由于它们来自不同的源,因此需要在同一代码集中分别维护它们。每个XSD集合都有深度嵌套的类,并生成大约650个类。我正在使用Maven JAXB插件生成Java类 如果我指定了

  • 我目前正在使用JAXB使用Mojo Maven插件'jaxb2-maven-plugin'生成的类为我们的Netbeans平台应用程序实现功能。不幸的是,XSD文件的创建不在我手中,它们是机密的。我试图提供一个最小的运行示例来进一步证明这一点,但现在我希望有人可以仅从我的描述中将我推向正确的方向。 我们有很多XSD文件,在过去的几周里得到了一些补充。其中两个XSD(我们称之为A.xsd和B.xsd

  • 我有一个react-native应用程序,带有react-native购买和react-native指示包。他们都有进口品 由:java.lang.runtimeException:com.android.builder.dexing.dexarchivEmergerException:合并dex归档时出错:在https://developer.android.com/studio/build/d

  • 问题内容: 我有一个巨大的QuickBooks SDK .XSD模式文件,该文件定义了我可以从QuickBooks发送/接收的XML请求/响应。 我希望能够轻松地从这些.XSD文件生成Java类,然后将其用于将XML编组为Java对象,以及将Java对象编组为XML。 是否有捷径可寻…? 理想情况下,它在运行时不需要基本Java发行版外部的任何库。但是我很灵活 问题答案: JAXB确实可以满足您的

  • 我对Jaxb和这个maven-jaxb2插件非常陌生 这是我的. xsd文件: 这是我的。xjb文件: 当它生成时,它给出的java类有点像: 但是我不想为用户和用户列表重复相同的代码,我可以通过注释或定义正则表达式来做什么。请建议一些方法。 我只是想知道这段代码要写什么 因此,当它创建用户类时,它会显示@xmlRootElement(name='user'),而其他类的@xmlRootEleme

  • 背景:我正在尝试将WSDL/XSD转换为Java类 问题:生成的包名称与命名空间不匹配。数字命名空间的最后一部分丢失,包中缺少02以下的部分 XSD已经-xmlns=“urn:iso:std:iso:20022:tech:XSD:pain.001.001.02” Java类生成——包iso。标准iso_20022.tech.xsd。疼痛001 001; 采取的步骤: 我尝试了2个maven插件,两