首页 > 解决方案 > 从模式生成 JAXB java 类:如何获取自定义 XML 元素名称(保留类名称)

问题描述

我有一个带有元素的 XSD - 如果有区别,它就是 XMLRootElement - 像这样:

<xsd:element name= "SomeElement">

我需要让生成的 Java 类具有自定义 XML 元素名称,同时保留默认 Java 类名称,因此生成的类需要如下所示:

@XmlRootElement(name = "fo:SomeElement")
public class SomeElement

这样编组/未编组的 xml 元素将显示为

<fo:SomeElement>

有人可以帮我解决我需要更改为 XSD 文件或绑定文件的内容吗?

标签: javajaxbxml-namespacesjaxb2-maven-pluginschemagen

解决方案


首先,随着你的问题,你打开了一大罐蠕虫。事情比你想象的要复杂。要完全理解这个答案的其余部分,您肯定需要更多地了解 XML 中的命名空间概念,例如w3schools.com - XML Namespaces。话虽如此,以下内容应该可以快速进入该主题。

请注意,这fo:SomeElement不是直接的 XML 元素名称。fo:是所谓的命名空间前缀。命名空间前缀需要通过 映射到命名空间URI xmlns:fo="..."

按照惯例fo:,是用于XSL 格式化对象的命名空间前缀。因此,您的 XML 文件很可能如下所示:

<fo:SomeElement xmlns:fo="http://www.w3.org/1999/XSL/Format" ...>
    ...
</fo:SomeElement>

请注意,这是XSL 格式化对象规范"http://www.w3.org/1999/XSL/Format"中指定的命名空间 URI 。

另请注意,命名空间前缀(此处fo)本身是无关紧要的,只是为了使 XML 内容更易于人类阅读而发明的。因此,fo您不妨bla在所有地方都使用命名空间前缀,而 XML 内容仍然具有完全相同的含义。唯一相关的是命名空间 URI(此处"http://www.w3.org/1999/XSL/Format")。

使用 JAXB,正确的 Java 根类将如下所示。注意注释中namespace给出的@XmlRootElement

@XmlRootElement(name="SomeElement", namespace="http://www.w3.org/1999/XSL/Format")
public class SomeElement {
   ...
}

您不仅需要在 中指定此名称空间-URI ,而且还需要为与任何XML 内容@XmlRootElement对应的嵌套 Java 属性指定此名称空间-URI。<fo:something>为此,大多数 JAXB 注释(@XmlElement, @XmlAttribute, ...)也可以接受namespace参数。

与上述 XML 示例和 Java 类一致的 XML 模式定义 (XSD) 如下所示。注意元素中targetNamespace给出的。<xs:schema>

<xs:schema version="1.0" targetNamespace="http://www.w3.org/1999/XSL/Format"
                         xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="SomeElement">
    ...
  </xs:element>
</xs:schema>

推荐阅读