当前位置: 首页 > 知识库问答 >
问题:

JAXB何时进行解组。解组返回一个JAXBElement或一个MySchemaObject?

夏侯和韵
2023-03-14

我有两个代码,在两个不同的java项目中,执行几乎相同的操作(根据xsd文件解组Web服务的输入)。

但在一个例子中,我应该这样写:(Input是一个占位符名称)(element是OMElement Input)

ClassLoader clInput = input.ObjectFactory.class.getClassLoader();
JAXBContext jc = JAXBContext.newInstance("input", clInput);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() );

在另一个库中,我必须使用JAXBElement。getValue(),因为它是返回的JAXBElement,并且简单(输入)转换会崩溃:

Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() ).getValue();

你知道是什么导致了这种差异吗?

共有3个答案

张鹏鹍
2023-03-14

您需要添加到您的JAXB生成的类适当的@XMLRootElement-它应该有命名空间:

@XmlRootElement(namespace="http://your.namespace.com/", name="yourRootElement")

看一看相关的问题(有很多好的提示):当试图解组xml时类强制转换异常?

朱令
2023-03-14

这取决于根元素类上是否存在XmlRootElement注释。

如果从XSD生成JAXB类,将应用以下规则:

  • 如果根元素的类型是匿名类型-

因此,我经常为根元素选择匿名类型。

可以使用自定义文件自定义此匿名类型的类名。例如,创建一个绑定。xjc文件如下所示:

<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="yourXsd.xsd" node="/xs:schema">
        <jxb:bindings  node="//xs:element[@name='yourRootElement']">
            <jxb:class name="YourRootElementType"/>
        </jxb:bindings> 
    </jxb:bindings>
</jxb:bindings>
章侯林
2023-03-14

如果根元素唯一地对应于一个Java类,那么将返回该类的实例,如果不是,则返回JAXBElement

如果要确保始终获得域对象的实例,可以利用JAXBInstrospector。下面是一个例子。

演示

package forum10243679;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    private static final String XML = "<root/>";

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBIntrospector jaxbIntrospector = jc.createJAXBIntrospector();

        Object object = unmarshaller.unmarshal(new StringReader(XML));
        System.out.println(object.getClass());
        System.out.println(jaxbIntrospector.getValue(object).getClass());

        Object jaxbElement = unmarshaller.unmarshal(new StreamSource(new StringReader(XML)), Root.class);
        System.out.println(jaxbElement.getClass());
        System.out.println(jaxbIntrospector.getValue(jaxbElement).getClass());
    }

}

输出

class forum10243679.Root
class forum10243679.Root
class javax.xml.bind.JAXBElement
class forum10243679.Root
 类似资料:
  • 问题内容: 我在两个不同的Java项目中有两个代码,几乎可以完成相同的工作(根据xsd文件解组Web服务的输入)。 但是在一种情况下,我应该这样写:(输入是一个占位符名称)(元素是OMElement输入) 在另一个库中,我必须使用JAXBElement.getValue(),因为它是返回的JAXBElement,并且简单的(Input)强制转换会崩溃: 您知道导致这种差异的原因吗? 问题答案: 如

  • 当在testng单元testcase中运行时,JAXB将XML文件解组到对象中工作正常。 当相同的代码被用来在另一个进程中解封相同的XML文件时,我得到了一个空对象。我可以验证对象是为XML文档中的每个元素创建的,并且所有适配器都被调用。在unmarshaller中设置事件处理程序,但没有验证问题。当我设置xmlns属性和前缀时,即使返回空对象,行为也略有不同。 我看了好几篇文章,但都无法与我面临

  • 我有下面的JAXB注释类(用XJC生成) 当以下面的方式解组它时,一切都很好: 当按以下方式解组时,它将崩溃,出现异常 例外: 有人能解释这种奇怪的行为吗? 正在解组的XML文件粘贴在下面:

  • 我正在从第三方网站(家庭用电)检索JSON,根据我从网站请求的内容,返回的JSON可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(由于尺寸大,结果被截断): 其中 gwrcmd 是单个元素。 但是如果我要求过去半个小时的用电,我会得到这个: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个类似这样的结构(再次,被截断,因为它持续了一段时间。“版本”下有更

  • 我是JPCAP的新手。我在用 eth0链路Encap:Ethernet HWaddr 18:A9:05:CB:8D:FB 上行广播多播MTU:1500度量:1个RX数据包:0个错误:0个丢弃:0个溢出:0帧:0个TX数据包:0个错误:0个丢弃:0个溢出:0载波:0个冲突:0个TX队列n:1000个RX字节:0(0.0B)TX字节:0(0.0B)中断:17 lo链接Encap:本地环回 inet A

  • 我认为这对真正理解JAXB绑定文件的人来说很容易... 如何配置JAXB将多个元素解组到同一个类中? 注意:我想避免在我的项目中添加另一个依赖项(比如MOXy)。理想情况下,这可以通过注释或自定义绑定文件来实现。 我有一个XML文档,其中包含许多相同元素的变体——每个元素都有完全相同的属性。使用下面的示例,我只关心“员工”,但XML指定了“董事、经理和员工”。为了我们的目的,这些都是同一个父类的子