You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:20:02