C# XDocument правильный способ экранирования символов - PullRequest
0 голосов
/ 28 апреля 2020

Здравствуйте, я борюсь с экранированием в 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>

ПОСЛЕ createnewdataset (без 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...