首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取JAXB对象的名称空间

如何获取JAXB对象的名称空间
EN

Stack Overflow用户
提问于 2012-06-08 22:32:28
回答 5查看 5.9K关注 0票数 6

目前,我正在使用以下代码将JAXB对象编组到输出流

代码语言:javascript
复制
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(new JAXBElement(new QName("hard_coded_namespace", clazz.getSimpleName()), clazz, obj), out);

我想将"hard_coded_namespace“替换为JAXB "obj”中包含的名称空间(或者它的一个属性,它们目前应该共享相同的NS)。

有什么办法在编组前获取NS信息吗?在输出流中,将出现命名空间。所以他们在"obj“中的某个地方。

更新正如下面的答案所指出的,我不需要设置JAXB_FRAGMENT属性。我将其更改为:

代码语言:javascript
复制
    JAXB.marshal(new JAXBElement<T>(new QName("hard_coded_namespace", rootName), clazz, jaxbObject), out);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-11 22:36:34

现在,这是我找到的解决方案:

代码语言:javascript
复制
    String nsURI = "";
    for(Annotation annotation: jaxbObject.getClass().getPackage().getAnnotations()){
        if(annotation.annotationType() == XmlSchema.class){
            nsURI = ((XmlSchema)annotation).namespace();
            break;
        }
    }

欢迎更优雅的解决方案:-)

票数 4
EN

Stack Overflow用户

发布于 2012-06-10 09:03:30

您需要使用marshal API吗?有一个更简单的重载。只要obj的运行时类具有注释@XmlRootElement,您就应该能够简单地调用

代码语言:javascript
复制
marshaller.marshal(obj, out);
票数 1
EN

Stack Overflow用户

发布于 2012-06-11 22:17:03

使用Marshaller.JAXB_FRAGMENT属性实际上与处理非根元素没有任何关系。它充当一个标志,用于确定是否应该限制某些封送处理事件。例如,如果设置了该属性,则不会生成开始和结束文档事件。

我还没有对以下内容进行测试,但这里是关于如何创建一些实用程序代码来查找给定JAXB对象的QName的基本想法:

反射如果JAXBIntrospector.isElement返回true,则只需使用JAXBIntrospector.getElementName.

  • Use
  • 在与ObjectFactory对象相同的包中查找ObjectFactory类上的方法,该方法返回JAXBElement并接受单个参数,该参数是与JAXB对象属于同一类的实例。调用该方法,然后使用JAXBElement.getName.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10950857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档