在PDI的Modified JavaScript Value步骤中插入XML避免转义的方法
解决PDI中Modified JavaScript Value生成XML时标签转义问题
问题根源
你之前的操作是把每个商品的XML转成字符串后拼接,当把这个字符串插入到XML对象中时,PDI的JavaScript引擎会将字符串里的<和>自动转义成<和>——因为它把这部分当成了文本内容,而非合法的XML节点。
修正方案(全程用Modified JavaScript Value实现)
1. 第一步:生成商品XML节点而非字符串
在第一个Modified JavaScript Value步骤中,直接保留XML对象,不要转成字符串,同时保留订单字段用于后续分组:
// 创建商品XML节点,不转换为字符串 var itemNode = <rowItem> <ItemCode>{item}</ItemCode> <Quantity>{qty}</Quantity> </rowItem>; // 需在步骤的「字段」配置中新增两个输出字段: // - item_xml:类型选择Object,映射变量itemNode // - order_group:直接映射原order字段
2. 第二步:按订单分组聚合XML节点集合
使用Group By步骤,按order_group字段分组,对item_xml字段选择聚合类型为Concatenate objects,输出字段命名为items_node_list(该字段会存储同订单下所有商品的XML节点集合)。
3. 第三步:构建完整XML结构
在第二个Modified JavaScript Value步骤中,将聚合后的XML节点集合直接插入目标节点,而非字符串拼接:
// 初始化完整XML框架 var body = <BO> <Level1A_Header> <rowHeader> <Field1>{variable1}</Field1> <Field2>{variable2}</Field2> <!-- 补充其他头部字段 --> </rowHeader> </Level1A_Header> <Level1B_Items> </Level1B_Items> </BO>; // 获取商品容器节点,批量追加商品XML节点 var itemsContainer = body.Level1B_Items; for each (var node in items_node_list) { itemsContainer.appendChild(node); } // 按需转换为字符串输出 var finalXml = body.toXMLString();
替代方案(纯字符串拼接避免转义)
如果偏好纯字符串操作,可全程拼接后再转XML对象(注意需自行处理特殊字符转义):
// 第一步:生成商品XML字符串 var lineXml = '<rowItem><ItemCode>' + item + '</ItemCode><Quantity>' + qty + '</Quantity></rowItem>'; // Group By步骤按order分组,用Concatenate字符串聚合,分隔符留空,得到xml_lines // 第二步:拼接完整XML字符串后转对象 var fullXmlStr = '<BO><Level1A_Header><rowHeader><Field1>' + variable1 + '</Field1><Field2>' + variable2 + '</Field2></rowHeader></Level1A_Header><Level1B_Items>' + xml_lines + '</Level1B_Items></BO>'; var body = new XML(fullXmlStr); // 或直接输出fullXmlStr作为最终结果
注意事项
- XML对象操作方式会自动处理特殊字符(如&、<等),更安全可靠;纯字符串拼接需自行处理这些字符,否则会导致XML格式错误。
- Group By聚合时需确保选择Object类型聚合,而非字符串聚合,否则仍会出现转义问题。
内容的提问来源于stack exchange,提问作者Isaac Gutierrez
相关产品推荐
相关产品推荐

