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

时间:2012-04-30 12:57:37

标签: java xml xml-serialization jaxb

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

@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");

但我想避免输入命名空间,如:

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

我很感激有关如何实施getNamespace()功能的任何提示。


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

1 个答案:

答案 0 :(得分:3)

您需要抓住包裹(例如,如果ROOTELEMENT在您想要的包装中,则使用ROOTELEMENT.class.getPackage())。然后您可以按照以下步骤进行处理:

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