OUAF服务脚本raw类型Schema节点在IWS响应中不显示的问题
解决IWS中Raw类型节点不输出的问题
问题根源
你碰到的核心问题是IWS对type="raw"节点的处理逻辑特殊:move操作只是把DOM对象引用赋值给了节点,但Raw节点要求输入的是XML字符串而非DOM对象,所以日志能看到内部有值,但响应序列化时无法识别DOM引用,导致节点不输出。
具体解决步骤
方案1:转XML字符串后直接赋值
放弃move方法,先把捕获到的myXml DOM节点转换成XML字符串,再用setElementValue直接赋值给rawNode:
// 把DOM节点转为XML字符串 def xmlWriter = new StringWriter() def transformer = javax.xml.transform.TransformerFactory.newInstance().newTransformer() transformer.transform(new javax.xml.transform.dom.DOMSource(myXml), new javax.xml.transform.stream.StreamResult(xmlWriter)) def rawXmlStr = xmlWriter.toString() // 给rawNode设置字符串值 setElementValue("parm/output[last()]/childList[last()]/grandChildList[last()]/rawNode", rawXmlStr)
方案2:调整Schema结构避免嵌套冲突
如果嵌套列表里的rawNode始终无法输出,尝试把rawNode移到列表外的独立group中,修改后的Schema如下:
<parm> <output type="group"> <childList type="list"> <grandChildList type="list"> <node1/> <node2/> </grandChildList> </childList> <!-- 新增独立group存放raw节点 --> <rawContentGroup type="group"> <rawNode type="raw"/> </rawContentGroup> </output> </parm>
再用方案1的代码把XML字符串赋值到新路径parm/output[last()]/rawContentGroup/rawNode,避免列表嵌套导致的序列化异常。
方案3:简化DOM转字符串(环境支持时)
如果你的运行环境支持DOM节点的outerHTML属性,可以直接获取字符串:
def rawXmlStr = myXml.outerHTML setElementValue("parm/output[last()]/childList[last()]/grandChildList[last()]/rawNode", rawXmlStr)
关键提醒
- Raw节点只认XML字符串,不能直接传DOM对象,这是
move操作无效的核心原因。 - 把Raw节点放在嵌套列表里容易触发序列化冲突,尽量放在非列表的group下。
- 移到group类型节点时的栈溢出,是因为DOM对象存在循环引用,转成字符串后就能彻底避免。
内容的提问来源于stack exchange,提问作者karmachameleon
相关产品推荐
相关产品推荐

