Как заставить сериализатор System.Web XmlSerializer кодировать кавычки c# - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующий тестовый пример:

    [TestMethod]
    public void SimpleEncodingTest()
    {
        var report = new SimpleReport{Title = @"[quote]""[/quote] [apo]'[/apo] [smaller]<[/smaller] [bigger]>[/bigger] [and]&[/and]" };


        XmlSerializer xsSubmit = new XmlSerializer(typeof(SimpleReport));

        var xml = "";

        using (var sww = new StringWriter())
        {
            using (XmlWriter writer = XmlWriter.Create(sww, new XmlWriterSettings
            {
                Encoding = Encoding.Default
            }))
            {
                xsSubmit.Serialize(writer, report);
                xml = sww.ToString(); // Your XML
            }
        }


    }

Я хочу, чтобы все специальные символы, включая кавычки в апострофе, были включены следующим образом:

    <?xml version="1.0" encoding="utf-16" ?>
    <SimpleReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Title>[quote]&quot;[/quote] [apo]&apos;[/apo] [smaller]&lt;[/smaller] [bigger]&gt;[/bigger] [and]&amp;[/and]</Title>
    </SimpleReport>

С заголовком "[ quote] "[/ quote] [apo] '[/ apo] [меньше] <[/ меньше] [больше]> [/ больше] [и] & [/ и]"

Вместо этого я получаю:

    <?xml version="1.0" encoding="utf-16" ?>
    <SimpleReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Title>[quote]"[/quote] [apo]'[/apo] [smaller]&lt;[/smaller] [bigger]&gt;[/bigger] [and]&amp;[/and]</Title>
    </SimpleReport>

И заголовок [/ quote] [apo] '[/ apo] [меньше] <[/ меньше] [больше]> [/ больше] [и] & [/ и].

Как мне сообщить сериализатору, что у меня также есть закодированные кавычки и апострофы?

PS: Я знаю, что вам обычно не нужно кодировать эти символы, но это требование клиента.

Попытки:

  • попытались предоставить такие настройки, как: Избегать XML Escape Double Quote , но это не изменило результат

  • Попытка изменить кодировку на UTF-8 и другие кодировки безуспешно

  • https://www.codeproject.com/Questions/1249846/How-do-you-force-Csharp-xmlserializer-to-escape-ap

  • Попытка с использованием System. Net .WebUtility.HtmlDecode (строка ). Однако System. Net .WebUtility.HtmlDecode (string) не кодирует кавычки и апостроф.

  • Пробовал с помощью SecurfityElement.Escape (строка). Это правильно перевело строку в &quot; сериализатор, а затем преобразовало это в &amp;quot;.

1 Ответ

0 голосов
/ 24 февраля 2020

Как? Поскольку они не входят в атрибут, скажите вашему клиенту, что вы закодировали их в UTF16 - что вы и сделали. В противном случае вы обычно можете использовать метод SecurityElement.Escape(String) для экранирования строки, что приведет к двойному экранированию. К сожалению, даже выполнение

" -> &quot;
' -> &apos;

превращает вас,

Title = text.Replace("\"", "&quot;").Replace("'", "&apos;")

приводит к двойной цитате ... Но, по крайней мере, насколько я знаю, это единственные, которые не избежали автоматического выхода между XML узлами, поскольку они действительны в этой точке. Так что я думаю, что это не возможно так, как этого хочет ваш клиент. по крайней мере, не со стандартными сериализаторами. К сожалению

...