java - 在运行时获取 @XmlType 的命名空间

标签 java xml xml-serialization jaxb

在编码 xjc 生成的类实例时,我尝试正确输出 schemaLocation 属性。根元素类如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "rootElement"
})
@XmlRootElement(name = "ROOTELEMENT")
public class ROOTELEMENT {
    // Members
}

我看到包中有一个 package-info.java 类,其中包含所有生成的类,其内容如下:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://my.own.namespace", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package my.generated.classes.package;

JAXB XJC code generation - “schemaLocation” missing in xml generated by Marshaller的答案建议设置 Marshaller.JAXB_SCHEMA_LOCATION 属性,它确实有效:

marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://my.own.namespace my_schema.xsd");

但我想避免输入 namespace ,如下所示:

String namespace = getNamespace(rootElementInstance);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, namespace + " my_schema.xsd");

如果有任何有关如何实现 getNamespace() 函数的提示,我将不胜感激。


编辑:我已经看到 XmlRootElementXmlType 注释具有 namespace() 方法,这似乎就是我所追求的(实际上,他们似乎委托(delegate)了 package-info.java 中提供的 XmlSchema)。但是,我无法将 ROOTELMENT 实例转换为任何这些类型。

最佳答案

您需要捕获您的包(例如,如果 ROOTELMENT 位于您想要的包中,则使用 ROOTELMENT.class.getPackage())。然后您可以简单地进行如下处理:

Package package = // Here retrieve the package;
String namespace = package.getAnnotation(XmlSchema.class).namespace();
...etc...

关于java - 在运行时获取 @XmlType 的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10384104/

相关文章:

java - Hibernate 一对多映射 - 在 Java 中遵循这一点是正确的做法吗?

c# - 使用 XmlSerializer 忽略 .NET 中 Xml 序列化中的属性

c# - 枚举的序列化失败

c# - 重写属性上的 .net XmlSerializer

java - 如果扫描器接收到除 int 之外的其他内容,则会创建无限循环

java - Maven - 如何在两个相互依赖的项目中使用不同的版本依赖关系

java - 使用队列解耦程序

java - 使用 Intent 将数据从一个 View 传递到另一个 View

c# - 如何确保使用 utf-8 文件编码保存 XDocument?

android - 为什么滚动 listView 时项目会消失?