在VerifyTests的VerifyXml中如何保留CDATA与XML注释?
解决VerifyTests中VerifyXml保留CDATA与XML注释的问题
核心方案
VerifyXml默认的XML处理逻辑会自动剥离CDATA块和注释,要保留这些内容,需要自定义XML格式化器,替换默认的处理行为。
具体实现步骤
1. 实现自定义XML格式化器
创建一个自定义的扩展方法,通过手动遍历XML节点并配置XmlWriter,确保CDATA和注释被保留:
using System.Xml; using VerifyTests; public static class CustomXmlVerificationExtensions { public static void PreserveCDataAndComments(this VerifySettings settings) { settings.RegisterXmlFormatter((xmlContent, textWriter) => { var writerSettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Auto }; using var xmlWriter = XmlWriter.Create(textWriter, writerSettings); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlContent); TraverseAndWriteNodes(xmlDoc.DocumentElement, xmlWriter); }); } private static void TraverseAndWriteNodes(XmlNode node, XmlWriter writer) { switch (node.NodeType) { case XmlNodeType.Element: writer.WriteStartElement(node.Name); foreach (XmlAttribute attr in node.Attributes) { writer.WriteAttributeString(attr.Name, attr.Value); } foreach (XmlNode childNode in node.ChildNodes) { TraverseAndWriteNodes(childNode, writer); } writer.WriteEndElement(); break; case XmlNodeType.CDATA: writer.WriteCData(node.Value); break; case XmlNodeType.Comment: writer.WriteComment(node.Value); break; default: writer.WriteNode(node, true); break; } } }
2. 在MSTest测试中应用自定义逻辑
在测试方法里调用自定义扩展方法,启用CDATA和注释的保留:
[TestClass] public class XmlTests { [TestMethod] public async Task VerifyXml_KeepCData() { var xml = @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?><person><![CDATA[name is John Doe]]></person>"; var settings = new VerifySettings(); settings.PreserveCDataAndComments(); await Verifier.VerifyXml(xml, settings); } [TestMethod] public async Task VerifyXml_KeepComments() { var xml = @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?><person><!-- name is John Doe --></person>"; var settings = new VerifySettings(); settings.PreserveCDataAndComments(); await Verifier.VerifyXml(xml, settings); } }
原理说明
- 默认
VerifyXml的序列化逻辑会将CDATA内容转为普通文本,同时过滤注释节点。 - 自定义格式化器通过手动遍历XML节点,识别CDATA和注释类型,调用
XmlWriter的对应方法直接写入,从而保留原始结构。 XmlWriterSettings的ConformanceLevel.Auto配置确保包含注释的XML能正常序列化,不会抛出格式异常。
内容的提问来源于stack exchange,提问作者Dani Avni
相关产品推荐
相关产品推荐

