在标记内声明命名空间使得此标记使用命名空间作为默认命名空间?

时间:2016-03-21 18:18:59

标签: xml xsd namespaces schema

因此,给定以下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

要么传入的消息没有正确创建,那么应该通知消息来源,或者应该调整代码以便为我处理这种新格式。

0 个答案:

没有答案