Сериализация Xml: пустая строка

260
19 февраля 2017, 08:14

Имеется следующий код:

using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Test
{
    class Program
    {
        static XmlSerializerNamespaces emptyNamespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("") });
        static void Main(string[] args)
        {
            string path = @"D:\Temp\1.xml";
            People test = new People { Name = "Sarah", Address = "" };
            XmlSerializer ser = new XmlSerializer(typeof(People));
            using (Stream stream = File.Create(path))
                ser.Serialize(stream, test, emptyNamespaces);
        }
    }
    public class People
    {
        public string Name { get; set; }
        public string Address { get; set; }
    }
}

После выполнения получаю xml следующего содержания:

<?xml version="1.0"?>
<People>
  <Name>Sarah</Name>
  <Address />
</People>

Требуется чтобы при пустой строке xml содержал также открывающий и закрывающий теги:

<?xml version="1.0"?>
<People>
  <Name>Sarah</Name>
  <Address></Address>
</People>

Как сделать это?

Набросал такое регулярное выражение для замены, вроде работает корректно (есть специалисты по регекспам?):

string s2 = Regex.Replace(s1, @"<(\w+)\s*/>", @"<$1></$1>");

Возможно ли на его основе состряпать адаптер для потока? Как это сделать?

Answer 1

Это можно сделать через кастомный XmlTextWriter, который будет принудительно писать полный закрывающий элемент:

public class MyXmlTextWriter : XmlTextWriter
{
    public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8)
    {
    }
    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }
}
static void Main(string[] args)
{
    string path = @"D:\Temp\1.xml";
    People test = new People { Name = "Sarah", Address = "" };
    XmlSerializer ser = new XmlSerializer(typeof(People));
    using (Stream stream = File.Create(path))
    {
        using (var writer = new MyXmlTextWriter(stream))
        {
            ser.Serialize(writer , test, emptyNamespaces);
        }
    }
}

взято с http://stackoverflow.com/questions/13539555/prevent-self-closing-tags-in-xmlserializer-when-no-data-is-present

READ ALSO
Нужна помощь, рекурсия [требует правки]

Нужна помощь, рекурсия [требует правки]

Не могу организовать рекурсиюПодскажи, где нужно исправить, чтобы функция правильно работала

236
Как получить int значения из SQL-запроса

Как получить int значения из SQL-запроса

Как получить число (int), полученное в результате такого SQL-запроса:

234
Открытие файла эксель на языке C#

Открытие файла эксель на языке C#

Всем привет, проблема такая, что не могу сделать запись в определенный файл, создается всегда новый файл

254
Печатная форма в c#. Visual Studio 2015

Печатная форма в c#. Visual Studio 2015

Есть задача создания печатного документа из приложения на c# в vs2015Документ нужен очень четких размеров и расположения элементов в форме

432