C#写入XML/XSLT文件时如何去除自动生成的"引号
问题根因
你当前代码出现多余"转义字符的核心原因有两个:
- 节点选择逻辑错误:
xDocument.SelectSingleNode("//@Name")选中的是<img>标签的Name属性节点本身,你把整段拼接的属性字符串赋值给这个属性的InnerText,相当于把所有内容都作为Name属性的值存储,XML序列化时会自动对值内的引号做转义,自然生成多余的转义符号。 - XML操作方式错误:手动拼接属性字符串赋值给DOM对象的方式不符合XML DOM的操作规范,DOM无法识别你拼接的内容是多个属性,只会把它当成普通的属性值处理,必然出现格式问题。
你实际的需求是保留<img>标签原有的Name='logo'属性,同时新增style、align、alt、src四个属性,不是把所有内容都塞到Name属性的值里。
修复方案
不要手动拼接属性字符串,先选中目标img元素节点,再通过属性集合逐个添加/更新对应属性,让DOM自动处理XML格式和特殊字符转义,代码如下:
string xDoc = @"Resources\general.Xslt"; XmlDocument xDocument = new XmlDocument(); xDocument.Load(xDoc); // 选中带Name="logo"属性的img元素节点,而非直接选中Name属性 XmlNode imgNode = xDocument.SelectSingleNode("//img[@Name='logo']"); if (imgNode?.Attributes != null) { // 逐个设置属性,属性已存在则更新值,不存在则新增 SetXmlAttribute(imgNode, "style", "width: 250px"); SetXmlAttribute(imgNode, "align", "middle"); SetXmlAttribute(imgNode, "alt", "E-Fatura Logo"); SetXmlAttribute(imgNode, "src", $"data:image/jpeg;base64,{base64Text}"); } xDocument.Save(xDoc); /// <summary> /// 给XML节点设置属性的辅助方法 /// </summary> void SetXmlAttribute(XmlNode targetNode, string attributeName, string attributeValue) { if (targetNode.Attributes[attributeName] != null) { targetNode.Attributes[attributeName].Value = attributeValue; return; } XmlAttribute newAttribute = targetNode.OwnerDocument.CreateAttribute(attributeName); newAttribute.Value = attributeValue; targetNode.Attributes.Append(newAttribute); }
最终生成的XML结构
运行修复后的代码,生成的XML格式完全符合预期,不会出现多余的转义引号:
<td width="40%" align="center" valign="middle"> <img Name="logo" style="width: 250px" align="middle" alt="E-Fatura Logo" src="data:image/jpeg;base64,{实际base64内容}"/> </td>
注意:操作XML文档时禁止手动拼接标签、属性字符串再赋值给DOM对象,这类写法不仅容易出现转义错误,还可能引入XML注入风险,所有节点、属性操作都要通过DOM提供的原生方法完成。
内容的提问来源于stack exchange,提问作者Kübra Nur
相关产品推荐
相关产品推荐

