当使用 `element.settextcontent()` 设置含 “ 的 xml 字符串时,dom 会自动转义为 `
在 Java DOM 编程中,setTextContent() 的行为是严格符合 XML 规范的:它将传入字符串视为纯文本内容,因此所有特殊字符(如 , &, “, ‘)都会被自动转义,以确保生成的文档格式合法。这正是你观察到 zuojiankuohaophpcnGrpHdryoujiankuohaophpcn 等被保留为实体引用的原因——DOM 并非“出错”,而是在履行其核心职责:防止非法嵌套与解析歧义。
要实现真正的 XML 结构嵌入(即 内部包含 子元素,而非一段被转义的字符串),必须将目标 XML 片段解析为真实的 DOM 节点树,并将其导入(import) 到当前文档中。直接调用 appendChild() 时传入的是 Node 对象(如 Element),而非字符串。
✅ 正确做法一:手动构建子元素(适用于结构固定、逻辑简单场景)
Element fitoFi = document.createElementNS("urn:iso:std:iso:20022:tech:xsd", "ns1:FIToFI");
// 构建 元素及其子节点
Element grpHdr = document.createElement("GrpHdr");
Element msgId = document.createElement("MsgId");
msgId.setTextContent("MQSECJYJHRBPDTZTYNNEYXOZUPAUDEKVDFV");
grpHdr.appendChild(msgId);
Element creDtTm = document.createElement("CreDtTm");
creDtTm.setTextContent("2023-02-02T21:48:58.075+05:30");
grpHdr.appendChild(creDtTm);
fitoFi.appendChild(grpHdr);
document.getDocumentElement().appendChild(fitoFi);
✅ 正确做法二:解析 XML 字符串并导入节点(推荐用于动态/复杂片段)
当你的 sample 字符串是完整、合法的 XML 片段(如 “…”),且可能动态变化时,应使用 DocumentBuilder.parse() 解析,再通过 Document.importNode() 安全迁移节点:
String innerXml = "" +
"MQSECJYJHRBPDTZTYNNEYXOZUPAUDEKVDFV" +
"2023-02-02T21:48:58.075+05:30" +
"";
// 1. 解析字符串为独立 Document
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document innerDoc = db.parse(new InputSource(new StringReader(innerXml)));
// 2. 获取根元素(此处为 GrpHdr)
Element innerRoot = innerDoc.getDocumentElement();
// 3. 导入到当前文档(deep=true 表示递归导入所有子节点)
Node imported = document.importNode(innerRoot, true);
// 4. 附加到 FIToFI 元素
Element fitoFi = document.createElementNS("urn:iso:std:iso:20022:tech:xsd", "ns1:FIToFI");
fitoFi.appendChild(imported);
document.getDocumentElement().appendChild(fitoFi);
⚠️ 关键注意事项: