Как обрабатывать XmlWriter.Create в подклассе - PullRequest
0 голосов
/ 25 июня 2019

Мне нужно изменить поведение XmlWriter для моего проекта, чтобы изменить способ сериализации пустых элементов XML. В настоящее время мой код использует XmlWriter и XmlSerializer, например:

public string Serialize(object o)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    ...

    StringWriter stringWriter = new StringWriter();

    XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings);
    XmlSerializer serializer = new XmlSerializer(o.GetType());
    serializer.Serialize(xmlWriter, o);

    return stringWriter.ToString();
}

При сериализации моего xml пустые элементы сериализуются в <emptyElement/>, но мне нужен xml для сериализации пустых элементов в <emptyElement></emptyElement>. Лучшее решение, которое я нашел для этого, было заявлено на этом форуме Microsoft несколько лет назад: https://social.msdn.microsoft.com/Forums/en-US/979315cf-6727-4979-a554-316218ab8b24/xml-serialize-empty-elements?forum=xmlandnetfx

Более быстрый и безопасный способ сделать это - написать собственный подкласс XmlWriter и передать его XmlSerializer.

YourXmlWriter агрегирует стандартный и переводит все вызовы WriteEndElement () в вызовы WriteFullEndElement ().

Я пытался написать свой собственный подкласс XmlWriter, переопределяя два метода, которые мне нужно переопределить:

public abstract class CustomXmlWriter : XmlWriter
    {
        public override void WriteEndElement()
        {
            WriteFullEndElement();
        }

        public override Task WriteEndElementAsync()
        {
            return WriteFullEndElementAsync();
        }
    }

Теоретически, я считаю, что это должно работать. Однако, пытаясь использовать код, я наталкиваюсь на кирпичную стену вокруг XmlWriter.Create . Я не могу привести полученный XmlWriter к своему CustomXmlWriter по очевидным причинам, и я не могу переопределить метод, так как это статический метод.

Как я должен иметь дело со статическим методом Create? Единственный другой способ сделать это - отказаться от идеи моего собственного CustomXmlWriter и просто манипулировать строкой в ​​конце моего метода, но это выглядит очень неправильно. Я не знаю, возможно ли то, чего я пытаюсь достичь, или есть где-то простая настройка, которую я нигде не могу найти.

1 Ответ

1 голос
/ 25 июня 2019

Попробуйте использовать регулярное выражение в качестве временного исправления.Входной переменной может быть вся строка xml, и она будет заменять каждое вхождение.:

        static void Main(string[] args)
        {

            string input = "<emptyElement/>";
            string patternNullTag = @"\<(?'tagname'\w+)/\>";
            string output = Regex.Replace(input, patternNullTag, ReplaceNullElement);
        }
        static string ReplaceNullElement(Match match)
        {
            string tagname = match.Value.Replace("<", "").Replace("/>", "");
            string newElement = "<" + tagname + ">" + "</" + tagname + ">";
            return newElement;
        }
...