【问题标题】:JAXB java class generation from schema: how to get a custom XML element name (keep class name)从模式生成 JAXB java 类:如何获取自定义 XML 元素名称(保留类名称)
【发布时间】:2021-03-15 14:00:58
【问题描述】:

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

<xsd:element name= "SomeElement">

我需要让生成的 Java 类有一个自定义的 XML 元素名称,同时保持默认的 Java 类名,所以生成的类需要如下所示:

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

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

<fo:SomeElement>

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

【问题讨论】:

    标签: java jaxb xml-namespaces jaxb2-maven-plugin schemagen


    【解决方案1】:

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

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

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

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

    注意"http://www.w3.org/1999/XSL/Format" 是命名空间URI 按照XSL Formatting Objects 规范中的规定。

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

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

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

    您不仅需要在@XmlRootElement 中指定此命名空间-URI, 但也适用于与任何&lt;fo:something&gt; XML 内容相对应的嵌套 Java 属性。 大多数 JAXB 注释 (@XmlElement, @XmlAttribute, ...) 也可以接受namespace 参数。

    与 XML 示例一致的 XML 模式定义 (XSD) 和 上面的 Java 类看起来像这样。 请注意&lt;xs:schema&gt; 元素中给出的targetNamespace

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多