首页 > 解决方案 > C# XDocument 转义符号的正确方法

问题描述

您好我在 xml 中转义,问题是我的输出被转义了 2 次,我不明白它为什么会发生。下面的代码:

        private static string FixSingleEncoding(string data)
    {
        //data?.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("&#34;", "&quot;").Replace("'", "&apos;");
        return System.Net.WebUtility.HtmlEncode(data); //SecurityElement.Escape(data);//
    }

    private static XDocument FixEncoding(XDocument instance)
    {
        XNamespace naming = instance.Root.Name.Namespace;
        var result = instance.Descendants(naming + "dataset").ToList();
        var count = result.Count;
        for (int i = 0; i < count; i++)
        {
            result[i].Value = FixSingleEncoding(result[i].Value);
        }
        return instance;
    }

    public static bool CreateNewDataset(string path, string data) 
    {
        Debug.WriteLine("CALL");
        XDocument xdoc = XDocument.Load(Path.Combine(MasterLocation, path));

        xdoc = FixEncoding(xdoc);


        XNamespace df = xdoc.Root.Name.Namespace;


        XElement root = new XElement(df+"changeSet");

        root.Add(new XAttribute("id", "My Name"));
        root.Add(new XAttribute("author", "Test"));


        string final = data;

        XElement innerelement = new XElement(df + "data", final);
        innerelement.Add(new XAttribute("endDelimiter", "GO"));
        root.Add(innerelement);

        xdoc.Root.Add(root);
        xdoc.Save(Path.Combine(MasterLocation, path));


        return true; 
    }

问题是当我第一次加载 xml 文件并使用 CreateNewDataset 方法时,它从 xml 文件中检索所有数据并取消转义旧数据,所以我输入了 FixEncoding 方法,但随后出现了另一个问题,现在它转义了两次,我怎么知道确切两次,很好地使用 VS Code 并将 XML Entity 转换为字符串,它需要转换 2 次为可读字符串, CreateNewDataset 方法只调用一次,但是数据转义了两次,我在这里错过了什么?

输入数据

IF EXISTS ( SELECT * 
                    FROM   sysobjects 
                    WHERE  id = object_id(N'[dbo].[table1]') 
                        and OBJECTPROPERTY(id, N'IsProcedure') = 0)

CreateNewDataset 之前的原始代码:

        <changeSet id="Test" author="My Name">
    <data endDelimiter="GO">
        IF EXISTS ( SELECT * 
                    FROM   sysobjects 
                    WHERE  id = object_id(N&apos;[dbo].[table1]&apos;) 
                        and OBJECTPROPERTY(id, N&apos;IsProcedure&apos;) = 0)
      </data>
</changeSet>

创建新数据集后(没有 FixEncoding)

<changeSet id="Test" author="My Name">
    <data endDelimiter="GO">
        IF EXISTS ( SELECT * 
                    FROM   sysobjects 
                    WHERE  id = object_id(N'[dbo].[table1]') 
                        and OBJECTPROPERTY(id, N'IsProcedure') = 0)
      </data>
</changeSet>

标签: c#xml.net-core

解决方案


推荐阅读