使用 JAXB 解组 XML,其中 soap 信封是子元素
Unmarshal XML where soap envelope is a child element, using JAXB
我想使用 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
.
更具体的内容
<tx>
元素需要更好的 Java 模型。
而不是将其声明为 Object
类型
@XmlAnyElement(lax = true)
private Object tx;
你需要用全功能声明它 Java class(我们称它为 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 ...>
你声明一个 属性
(我们称之为 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
class 重复相同的过程
用于对 XML 元素中的内容进行建模 <soapenv:Header>
和 <soapenv:Body>
:
@XmlAccessorType(XmlAccessType.FIELD)
public class SoapHeader {
...
}
@XmlAccessorType(XmlAccessType.FIELD)
public class SoapBody {
...
}
我想使用 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
.
<tx>
元素需要更好的 Java 模型。
而不是将其声明为 Object
@XmlAnyElement(lax = true)
private Object tx;
你需要用全功能声明它 Java class(我们称它为 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 ...>
你声明一个 属性
(我们称之为 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
class 重复相同的过程
用于对 XML 元素中的内容进行建模 <soapenv:Header>
和 <soapenv:Body>
:
@XmlAccessorType(XmlAccessType.FIELD)
public class SoapHeader {
...
}
@XmlAccessorType(XmlAccessType.FIELD)
public class SoapBody {
...
}