обратная косая черта обратной косой черты
/(<- the prompt)\/\*
, поэтому после ввода типа она выглядит как
/\/\*
Вы можете сделать это, создав свой собственный 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();
}
Время 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 в какую-либо другую систему, которую вы не можете легко исправить, должны быть прагматичными в отношении вещей)
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;
}
}
}
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
. В случае, если значение равно нулю, закрывающий тег не создается.
null -> ""
при сериализации / десериализации. – user 24 November 2012 в 13:12XmlWriter
. Для базовогоXmlWriter
требуетсяXmlWriterSettings
сIndent
, установленным наtrue
иNewLineChars
, для чего-то разумного. Пример: pastebin.com/G2bZNQnQ (также работает сStream
вместоTextWriter
) – domi1819 30 September 2016 в 20:29