如何用Java替换指定父标签下XML节点CDATA中的值
Java修改SOAP XML中CDATA节点值的解决方案
需求说明
需要对SOAP格式XML完成两项修改:
- 替换
<SwapTermList>父标签下<trade_qty>节点CDATA内的数值 - 替换
<SwapTermList>下<TermPriceList>子标签中<fixed_price>节点CDATA内的数值
已知已将XML解析为Document对象,需解决带CDATA的节点值替换问题。
解决方案
在Java中处理CDATA节点,核心思路是找到目标节点后,替换其内部的CDATA子节点内容(或直接替换CDATA节点)。以下是具体实现步骤:
1. 获取目标节点
通过XPath或DOM遍历找到目标节点(<trade_qty>和<fixed_price>):
// 示例:使用XPath查找<trade_qty>节点 XPath xpath = XPathFactory.newInstance().newXPath(); Node tradeQtyNode = (Node) xpath.evaluate("//SwapTermList/trade_qty", document, XPathConstants.NODE); // 查找<TermPriceList>下的<fixed_price>节点 Node fixedPriceNode = (Node) xpath.evaluate("//SwapTermList/TermPriceList/fixed_price", document, XPathConstants.NODE);
2. 替换CDATA内容
CDATA是CDATASection类型的节点,属于目标元素的子节点。我们可以直接替换其数据,或删除原有CDATA后新建:
// 替换<trade_qty>的CDATA内容 if (tradeQtyNode != null) { // 找到子节点中的CDATA CDATASection cdata = null; NodeList children = tradeQtyNode.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType() == Node.CDATA_SECTION_NODE) { cdata = (CDATASection) child; break; } } if (cdata != null) { // 直接替换CDATA内容 cdata.setData("新的trade_qty数值"); } else { // 如果没有CDATA,新建一个并添加 cdata = document.createCDATASection("新的trade_qty数值"); tradeQtyNode.appendChild(cdata); } } // 替换<fixed_price>的CDATA内容,逻辑同上 if (fixedPriceNode != null) { CDATASection cdata = null; NodeList children = fixedPriceNode.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType() == Node.CDATA_SECTION_NODE) { cdata = (CDATASection) child; break; } } if (cdata != null) { cdata.setData("新的fixed_price数值"); } else { cdata = document.createCDATASection("新的fixed_price数值"); fixedPriceNode.appendChild(cdata); } }
3. 注意事项
- 确保解析XML时保留CDATA节点(默认DOM解析会保留,但部分配置可能会将CDATA转为普通文本,需确认解析参数)
- 如果目标元素下有多个子节点(比如文本节点+CDATA),需准确定位CDATA节点
- 修改完成后,可将
Document重新序列化为XML字符串
等效.NET思路:通过
XmlNode.SelectSingleNode找到目标节点,然后修改其InnerText或直接操作CDATASection对象,逻辑与Java一致。
内容的提问来源于stack exchange,提问作者Rassermann
相关产品推荐
相关产品推荐

