Различные стили сериализации элементов для пустых строк [duplicate]

обратная косая черта обратной косой черты

/(<- the prompt)\/\*

, поэтому после ввода типа она выглядит как

/\/\*
11
задан Nishant Kumar 24 November 2012 в 13:10
поделиться

4 ответа

Вы можете сделать это, создав свой собственный XmlTextWriter, чтобы перейти в процесс сериализации.

public class MyXmlTextWriter : XmlTextWriter
{
    public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8)
    {

    }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }
}

Вы можете проверить результат, используя:

class Program
{
    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        {
            var serializer = new XmlSerializer(typeof(Notes));
            var writer = new MyXmlTextWriter(stream);
            serializer.Serialize(writer, new Notes() { typeName = "Acknowledged by PPS", dataValue="" });
            var result = Encoding.UTF8.GetString(stream.ToArray());
            Console.WriteLine(result);
        }
       Console.ReadKey();
    }
9
ответ дан armen.shimoon 19 August 2018 в 00:01
поделиться
  • 1
    Предостережение: это приведет к null -> "" при сериализации / десериализации. – user 24 November 2012 в 13:12
  • 2
    Работает, но тогда XML генерируется без прерывания строки после каждого элемента :( – SuperJMN 27 August 2014 в 11:25
  • 3
    @SuperJMN Вам нужно обернуть XmlWriter. Для базового XmlWriter требуется XmlWriterSettings с Indent, установленным на true и NewLineChars, для чего-то разумного. Пример: pastebin.com/G2bZNQnQ (также работает с Stream вместо TextWriter) – domi1819 30 September 2016 в 20:29
  • 4
    грустно, но не работает ... :( – Tommix 22 November 2017 в 22:38
  • 5
    Он имеет сумку в режиме с отступом. Этот stackoverflow.com/a/40423636/4594225 работает для меня. – Ali 15 June 2018 в 13:35

Время Kludge - см. Генерировать результат System.Xml.XmlDocument.OuterXml (), который действителен в HTML

В основном после того, как XML-документ был создан, пройдите через каждый узел, добавив пустой текстовый узел, если нет детей

// Call with
addSpaceToEmptyNodes(xmlDoc.FirstChild);

private void addSpaceToEmptyNodes(XmlNode node)
{
    if (node.HasChildNodes)
    {
        foreach (XmlNode child in node.ChildNodes)
            addSpaceToEmptyNodes(child);
    }
    else         
        node.AppendChild(node.OwnerDocument.CreateTextNode(""))
}

(Да, я знаю, что вам не нужно это делать, но если вы отправляете XML в какую-либо другую систему, которую вы не можете легко исправить, должны быть прагматичными в отношении вещей)

0
ответ дан Community 19 August 2018 в 00:01
поделиться
  • 1
    Мне пришлось изменить if (node.HasChildNodes) на if (node.HasChildNodes && node.NodeType != XmlNodeType.Text) – BurnsBA 2 April 2014 в 15:45

Вы можете добавить фиктивное поле, чтобы предотвратить самозакрывающийся элемент.

[XmlText]
public string datavalue= " ";

Или, если вам нужен код для вашего класса, тогда ваш класс должен быть таким.

public class Notes
{
   [XmlElement("Type")]
   public string typeName { get; set; }

   [XmlElement("Data")]
   private string _dataValue;
   public string dataValue {
      get {
          if(string.IsNullOrEmpty(_dataValue))
             return " ";
          else
             return _dataValue;
      }
      set {
          _dataValue = value;
      }
   }
}
0
ответ дан FAHID 19 August 2018 в 00:01
поделиться

IMO, невозможно создать желаемый XML с помощью Serialization. Но вы можете использовать LINQ to XML для генерации желаемой схемы, например:

XDocument xDocument = new XDocument();
XElement rootNode = new XElement(typeof(Notes).Name);
foreach (var property in typeof(Notes).GetProperties())
{
   if (property.GetValue(a, null) == null)
   {
       property.SetValue(a, string.Empty, null);
   }
   XElement childNode = new XElement(property.Name, property.GetValue(a, null));
   rootNode.Add(childNode);
}
xDocument.Add(rootNode);
XmlWriterSettings xws = new XmlWriterSettings() { Indent=true };
using (XmlWriter writer = XmlWriter.Create("D:\\Sample.xml", xws))
{
    xDocument.Save(writer);
}

Основной улов in case your value is null, you should set it to empty string. Это будет force the closing tag to be generated. В случае, если значение равно нулю, закрывающий тег не создается.

1
ответ дан Rohit Vats 19 August 2018 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: