Mirth通道操作XML的代码中'*::'语法的作用是什么
Mirth通道代码中
*::语法的具体含义与执行逻辑 *::是Mirth Connect内置Rhino JS引擎支持的E4X(ECMAScript for XML)原生语法,专门用于XML对象操作,和你提到的tmp为XML SOAP信封的场景完全匹配。
- 核心作用
这个语法是命名空间通配符,用来匹配节点时完全忽略XML命名空间前缀。
SOAP、WCF返回的XML报文通常会带多组命名空间前缀,比如<soap:Body>、<a:SavePathologyResults>这类,常规E4X写法必须写全前缀才能定位节点,比如tmp.soap::Body,一旦对接方调整了命名空间前缀、或者不同环境下报文命名空间有差异,写死前缀的代码会直接找不到节点抛错。
用*::就相当于给解析器传指令:不用校验当前节点的命名空间是什么,只要节点的本地名称(冒号后面的实际节点名)和我写的一致,就选中这个节点。 - 示例代码执行逻辑
你贴的存量代码:
执行时会从tmp.*::['Body'].*::['SavePathologyResults'].*::['request'].*::['PathologyResults'].*::['SavePathologyResultRequest'][index] = newWCFNode;tmp这个SOAP根节点开始逐层向下遍历:- 找到
tmp下任意命名空间的Body子节点 - 在
Body节点下找到任意命名空间的SavePathologyResults子节点 - 继续向下定位任意命名空间的
request子节点 - 再往下找到任意命名空间的
PathologyResults子节点 - 最终选中该节点下任意命名空间的
SavePathologyResultRequest子节点中,索引值等于index的节点,将其内容替换为newWCFNode
- 找到
- 存量代码大量使用该写法的原因
这是Mirth开发中处理带复杂命名空间的XML报文的通用容错写法,不需要提前在代码里声明所有用到的命名空间,也不会因为命名空间前缀变动、多版本接口命名空间差异导致节点定位失败,容错性远高于写死命名空间前缀的写法,非常适合对接逻辑不稳定的SOAP/WCF类接口。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

