使用JAXB来解组XML,其中soap信封是子元素

Nikita Mikhailov:

我想使用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 UI复制。

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

我怎么解决这个问题?只要可以方便地存储(在一个文件中)并反序列化复制粘贴的肥皂信封和我在示例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;

该类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 ...>您需要声明一个属性(我们称之为SoapEnvelope envelope)。需要给该属性加上注释,@XmlElement以告知JAXB它映射到XML元素名称Envelope特别注意其namespace参数,参数对应于XML名称空间定义xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

然后,对该SoapEnvelope重复相同的过程,以对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;
}

然后使用SoapHeaderSoapBody重复相同的过程,以对XML元素中的内容进行建模,<soapenv:Header><soapenv:Body>

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章