使用XmlDocument.LoadXml加载XML报错0x3C为无效属性字符问询
错误原因
你遇到的报错本质是XML属性值中出现了未正确转义的<字符(对应十六进制0x3C),你之前的转义操作只覆盖了C#字符串字面量的转义层,没有满足XML规范的要求:
XML属性值内不允许直接出现<字符,要保留该字符的显示,需要让XML解析器读取到的属性内容中<被转义为<、>被转义为>。而你当前代码中xmlStr运行时的实际内容里,属性值部分为some text goes here <textInBrackets>,XML解析器读到<就会判定为非法字符。
可行解决思路
方法1:手动调整转义层数
如果你坚持手动拼接XML字符串,需要对<、>做双层转义,把原字符串中的<替换为&lt;、>替换为&gt;即可:String xmlStr = "<Tag attribute1=\"some text goes here &lt;textInBrackets&gt;\" attribute2=\"other text\"></Tag>";此时
xmlStr运行时的属性内容为some text goes here <textInBrackets>,XML解析器可以正常识别,你后续读取属性值时会自动还原为<textInBrackets>。方法2:用.NET自带XML类自动处理转义(推荐)
手动拼接XML极易出现转义错误,建议直接使用XmlDocument的原生API生成节点和属性,框架会自动处理所有转义逻辑,你直接写入原始内容即可:XmlDocument xd = new XmlDocument(); // 创建根节点 XmlElement tagNode = xd.CreateElement("Tag"); // 添加属性1,直接写入带尖括号的原始内容即可 tagNode.SetAttribute("attribute1", "some text goes here <textInBrackets>"); // 添加属性2 tagNode.SetAttribute("attribute2", "other text"); xd.AppendChild(tagNode);后续读取
tagNode.GetAttribute("attribute1")时,拿到的就是带尖括号的原始内容,完全满足保留括号的需求。方法3:对属性值做统一XML编码后拼接
如果必须拼接XML字符串,可以调用.NET自带的编码方法处理属性值,避免手动转义出错:// 引用System.Web命名空间,或者用System.Security.SecurityElement.Escape方法 string attrValue = System.Web.HttpUtility.HtmlEncode("some text goes here <textInBrackets>"); string xmlStr = $"<Tag attribute1=\"{attrValue}\" attribute2=\"other text\"></Tag>"; XmlDocument xd = new XmlDocument(); xd.LoadXml(xmlStr);
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

