因此,给定以下xml,ticket元素是否使用声明的xmlns:mes1命名空间或它是否属于默认命名空间? (注意:在完整的原始消息中,永远不会声明xmlns名称空间)
<Ticket xmlns:mes1="http://roskazna.ru/gisgmp/xsd/116/MessageData">
<RequestProcessResult xmlns:tic="http://roskazna.ru/gisgmp/xsd/116/Ticket">
<ResultCode xmlns:err="http://roskazna.ru/gisgmp/xsd/116/ErrInfo">11</ResultCode>
<ResultDescription xmlns:err="http://roskazna.ru/gisgmp/xsd/116/ErrInfo">23503 : INSERT</ResultDescription>
<ResultData xmlns:err="http://roskazna.ru/gisgmp/xsd/116/ErrInfo">CONTEXT: SQL</ResultData>
</RequestProcessResult>
</Ticket>
我的理解是Ticket及其嵌套元素都在默认命名空间中,并且从不使用声明的命名空间。
但是这个片段来自一个严肃的信息系统,虽然之前它的消息包含soap头中的默认命名空间声明,而我感兴趣的部分就是这样(注意命名空间):
<mes1:Ticket xmlns:mes1="http://roskazna.ru/gisgmp/xsd/116/MessageData">
<tic:RequestProcessResult xmlns:tic="http://roskazna.ru/gisgmp/xsd/116/Ticket">
<err:ResultCode xmlns:err="http://roskazna.ru/gisgmp/xsd/116/ErrInfo">0</err:ResultCode>
<err:ResultData xmlns:err="http://roskazna.ru/gisgmp/xsd/116/ErrInfo">ID_6ac73577-1840-4110-8f24-33ae4760dfcf</err:ResultData>
</tic:RequestProcessResult>
</mes1:Ticket>
使用以下代码(java)无法正确处理第一个示例中最终收到的数据包
public ImportResponse(BaseMessageType msg) {
super(msg);
responseMessageData = ((ResponseMessageType) ((JAXBElement) messageData.getAppData().getAny().get(0)).getValue()).getResponseMessageData();
}
产生例外 java.lang.ClassCastException:org.apache.xerces.dom.ElementNSImpl无法强制转换为javax.xml.bind.JAXBElement
要么传入的消息没有正确创建,那么应该通知消息来源,或者应该调整代码以便为我处理这种新格式。