Java DOM中如何将XML字符串作为子元素插入而非转义文本?
解决XML字符串添加到命名空间元素时标签被转义的问题
用setTextContent()方法把XML格式字符串添加到<ns1:FIToFI>元素时,标签会被转成<和>——这是因为setTextContent()本来就是用来设置纯文本内容的,它会自动转义所有XML特殊字符。要保留原XML结构,得把字符串解析成DOM节点再插入,而不是当成文本处理。
具体实现步骤(以Java DOM API为例)
- 先把XML字符串解析成独立的DOM文档
- 将解析后的节点导入到目标文档的上下文(不同文档的节点不能直接复用)
- 把导入后的节点添加到
<ns1:FIToFI>元素下
// 假设已存在目标文档doc,以及获取到的<ns1:FIToFI>元素fitoFiElement String grpHdrXml = "<GrpHdr><MsgId>MQSECJYJHRBPDTZTYNNEYXOZUPAUDEKVDFV</MsgId><CreDtTm>2023-02-02T21:48:58.075+05:30</CreDtTm></GrpHdr>"; // 1. 解析XML字符串为DOM节点 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource xmlInput = new InputSource(new StringReader(grpHdrXml)); Document grpHdrDoc = builder.parse(xmlInput); Node grpHdrRoot = grpHdrDoc.getDocumentElement(); // 2. 导入节点到目标文档(true表示递归导入所有子节点) Node importedGrpHdr = doc.importNode(grpHdrRoot, true); // 3. 添加到<ns1:FIToFI>元素中 fitoFiElement.appendChild(importedGrpHdr);
注意事项
- 必须调用
importNode(),因为不同Document对象的节点属于不同的DOM上下文,直接调用appendChild()会抛出异常 - 如果
<GrpHdr>需要指定命名空间,可以开启DocumentBuilderFactory的命名空间感知:factory.setNamespaceAware(true);,然后在解析后的节点上设置对应的namespaceURI
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

