使用XmlDocument读取XML时如何保留
、
不被自动转义
原因说明
XmlDocument 加载XML内容时默认会自动解析属性中的字符实体引用,比如你例子里的
、
会被直接转为对应的回车、换行控制字符,直接读取XmlAttribute.Value属性只能拿到转义后的结果,要获取原始未转义的实体文本,可以用以下两种方案实现:
方案1:自定义XmlReader配置(推荐,符合XML规范)
通过调整XmlReader的实体处理规则,不自动展开字符实体,加载到XmlDocument后手动拼接属性的原始内容:
// 这里替换为你自己的原始XML字符串/输入流 string rawXml = @"<xml> <item content=""abcd 
 abcd 
 abcd"" /> </xml>"; XmlReaderSettings readerSettings = new XmlReaderSettings(); readerSettings.DtdProcessing = DtdProcessing.Ignore; // 禁用DTD处理避免安全风险 readerSettings.EntityHandling = EntityHandling.None; // 核心配置:不展开任何实体引用 XmlDocument xmlDoc = new XmlDocument(); using (XmlReader reader = XmlReader.Create(new StringReader(rawXml), readerSettings)) { xmlDoc.Load(reader); } XmlAttribute contentAttr = xmlDoc.SelectSingleNode("/xml/item").Attributes["content"]; StringBuilder rawContentBuilder = new StringBuilder(); // 遍历属性的子节点拼接原始内容 foreach (XmlNode node in contentAttr.ChildNodes) { if (node.NodeType == XmlNodeType.Text) { rawContentBuilder.Append(node.Value); } else if (node.NodeType == XmlNodeType.EntityReference) { rawContentBuilder.Append($"&{node.Name};"); } } // 最终得到的rawContent就是未转义的原始属性值 string rawContent = rawContentBuilder.ToString();
该方案适用于XML结构复杂、属性位置不固定的场景,兼容性最强。
方案2:正则匹配原始XML(简单高效,适合固定格式场景)
如果你的XML格式是固定的,不需要处理复杂的嵌套、转义场景,可以直接从原始XML字符串中正则匹配提取属性的原始值:
// 这里替换为你自己的原始XML字符串 string rawXml = @"<xml> <item content=""abcd 
 abcd 
 abcd"" /> </xml>"; // 正则匹配content属性的原始值,属性用单引号的话调整正则里的引号即可 var match = System.Text.RegularExpressions.Regex.Match(rawXml, @"<item\s+content=""([^""]+)""", RegexOptions.IgnoreCase); if (match.Success) { string rawContent = match.Groups[1].Value; }
内容的提问来源于stack exchange,提问作者WPInfo
相关产品推荐
相关产品推荐

