java - 使用 JAXB 解码 XML,其中 SOAP 信封是子元素

标签 java xml soap jaxb marshalling

我想使用 JAXB 反序列化以下 XML:

<testData>
    <tx>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                      xmlns:ns="http://my/namespace">
            <soapenv:Header>
               ...
            </soapenv:Header>
            <soapenv:Body>
                ...
            </soapenv:Body>
        </soapenv:Envelope>
   </tx>

   <flag>true</flag>
   <someObject>
      ...
   </someObject>
</testData>

问题是我不知道如何在 Java 模型中表示 SOAP 信封以成功反序列化它。 这是为我们的测试人员制作的工具的输入数据,信封将从 SOAP UI 复制。

我想出的唯一解决方案是使用 @XmlAnyElement(lax = true)并将信封作为模型中的对象,最终将被反序列化为 ElementNSImpl 。但这看起来并不是最好的解决方案。

如何解决这个问题?更改格式的建议也很受欢迎,只要它们能够方便地存储(在一个文件中)和反序列化复制粘贴的 SOAP 信封以及我在示例 XML 中添加的其他对象。

这是我目前的 Java 模型:

@XmlRootElement(name = "testData")
public class XMLWrapper {

    @XmlAnyElement(lax = true)
    private Object tx;
    private boolean flag;
    private SomeObject SomeObject;
}

和解码:

JAXBContext jaxbContext = JAXBContext.newInstance(XMLWrapper.class);
jaxbContext.createUnmarshaller().unmarshal(new File("file.xml"));

最佳答案

因为您为 XML 元素声明 <tx>类型为 Object 的属性, JAXB 没有足够的信息来创建比 ElementNSImpl 更具体的内容。 .

您将需要一个更好的 Java 模型 <tx>元素。 而不是将其声明为类型 Object

@XmlAnyElement(lax = true)
private Object tx;

您需要使用功能齐全的 Java 类来声明它(我们称之为 Tx ):

private Tx tx;

类(class)Tx表示 XML 元素 <tx>以及嵌套在其中的所有内容。 它可以看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
public class Tx {

    @XmlElement(name = "Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
    private SoapEnvelope envelope;
}

用于对 XML 元素建模 <soapenv:Envelope ...>你申报属性(property) (我们称之为 SoapEnvelope envelope )。该属性需要注释 与 @XmlElement 告诉 JAXB 它映射到 XML 元素名称 Envelope 。 特别注意它的 namespace对应于 XML 命名空间定义的参数 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" .

然后对 SoapEnvelope 重复相同的过程类(class) 用于对 XML 元素中的内容进行建模 <soapenv:Envelope> :

@XmlAccessorType(XmlAccessType.FIELD)
public class SoapEnvelope {

    @XmlElement(name = "Header", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
    private SoapHeader header;

    @XmlElement(name = "Body", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
    private SoapBody body;
}

然后对 SoapHeader 重复相同的过程和SoapBody类 用于对 XML 元素中的内容进行建模 <soapenv:Header><soapenv:Body> :

@XmlAccessorType(XmlAccessType.FIELD)
public class SoapHeader {
    ...
}
@XmlAccessorType(XmlAccessType.FIELD)
public class SoapBody {
    ...
}

关于java - 使用 JAXB 解码 XML,其中 SOAP 信封是子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53500394/

相关文章:

soap - 什么协议(protocol)提供者通过 SOAP 连接到 WebSphere 上的 JMX?

java - 使用maven的spring hibernate集成中的org.springframework.beans.factory.BeanCreationException

java - 向服务器发送 json 字符串

java - 让 hibernate 记录 clob 参数

python - 当我在 Odoo 8 中编辑表单时,为什么标题显示记录 ID 号?

javascript - 从服务器获取 SOAP 响应

java - Apache CXF AtomPullServer

xml - 生成 Google C++ 单元测试 XML 报告

php - 使用simplexml解析特殊字符xml文件

java - 组播错误: Multicast Address Not Found