C # System.Xml.Serialization - используйте только <a></a> и никогда - PullRequest
0 голосов
/ 05 марта 2019

У меня странная проблема с моим клиентом - я читаю XML-документ (фактически документ InfoPath) с XmlSerializer, изменяю его, затем выписываю XML-документ с помощью XmlSerializer, а затем добавляю некоторые инструкции по обработкеиспользуя XmlTextWriter.Все работает хорошо, и полученный документ полностью соответствует XML и может быть прочитан InfoPath.Однако одно изменение, которое происходит в структуре, заключается в том, что исходный документ имеет все пустые теги, записанные в форме <A></A>, и когда мой документ записывается, он становится <A/>.На самом деле точно так же из-за стандартов XML.Но у моего клиента (крупной компании), очевидно, есть несколько сценариев проверки / проверки с жестко заданным кодом <A></A>, и они терпят неудачу.Сейчас он расстроен и слишком ленив, чтобы изменить свои сценарии, и ему нужна запись <A></A>!Как я могу настроить XmlTextWriter, чтобы сделать это?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вы можете сделать это, предоставив XmlSerializer своего собственного потомка XmlWriter, который переопределит метод WriteEndElement .По умолчанию этот метод создает пустой элемент (<a />) или закрывающий элемент (</a>) в зависимости от содержимого выводимого элемента.Вы можете изменить поведение так, чтобы всегда создавался полный закрывающий элемент.

public class MyXmlWriter : XmlTextWriter
{
    // …constructors etc. omitted for the sake of simplicity…

    public override void WriteEndElement()
    {
        // this should do the trick
        WriteFullEndElement();
    }
}

Однако требуется еще немного работы, например, версия Async этого метода, но, в принципе, этого должно быть легко достичькак выше.Я бы порекомендовал заглянуть в исходный код из XmlTextWriter.WriteEndElement и найти версию, которая лучше соответствует вашему случаю.

0 голосов
/ 05 марта 2019

Честно говоря, я думаю, что если вы собираетесь использовать встроенный Serializer, то вам лучше будет найти / заменить.Не похоже, что вы можете переопределить фактическую форму тегов, по крайней мере я не видел способа сделать это, даже переопределяя некоторые из методов.

В результате я бы поставил проверкуэто говорит о том, что если тег пуст, введите значение, например "[[[EMPTYVALUE]]]", чтобы вы получили

<A>[[[EMPTYVALUE]]]</A>

Затем сгенерируйте свой XML и перед сохранением файла XML преобразуйтев строку и замените "<A>[[[EMPTYVALUE]]]</A>" на "<A></A>"

Вы можете просто заменить <A/>, но я думаю, что безопаснее создать большую строку для замены.

...