java - 从模式生成 JAXB java 类:如何获取自定义 XML 元素名称(保留类名称)
问题描述
我有一个带有元素的 XSD - 如果有区别,它就是 XMLRootElement - 像这样:
<xsd:element name= "SomeElement">
我需要让生成的 Java 类具有自定义 XML 元素名称,同时保留默认 Java 类名称,因此生成的类需要如下所示:
@XmlRootElement(name = "fo:SomeElement")
public class SomeElement
这样编组/未编组的 xml 元素将显示为
<fo:SomeElement>
有人可以帮我解决我需要更改为 XSD 文件或绑定文件的内容吗?
解决方案
首先,随着你的问题,你打开了一大罐蠕虫。事情比你想象的要复杂。要完全理解这个答案的其余部分,您肯定需要更多地了解 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>
推荐阅读
- java - 重启tomcat后如何更新类文件
- ms-access - 如何在 Access 中使用 VBA 查找具有空字段值的记录?
- html - 在此上下文中,不允许元素管理员作为元素跨度的子级
- c# - 用字符串连接算术运算的结果
- ios - 在 Xcode 上索引文本
- pyspark - 如何在 pyspark 的“过滤器”函数中放置一个范围?
- liferay - Liferay 7如何支持网络形式的文件上传?
- reactjs - React + jersey + spring + Tomcat 9 CORS
- c++ - 如何从 C++ 中的朋友类访问私有静态方法
- angularjs - 传递参数:到 Web API 适用于 $http.get 但不适用于 $http.Post