Если вы используете Mono, вот что:
Don Box взломал что-то очень простое несколько лет назад тоже .
Никогда не создавайте xml, используя конкатенацию строк. Это зло.
Вывод:
<?xml version="1.0" encoding="utf-16"?>
<!DOCTYPE APIRequest SYSTEM "https://url">
<APIRequest>
<Head>
<Key>123</Key>
</Head>
<ObjectClass>
<Field>Value</Field>
</ObjectClass>
</APIRequest>
Код:
using System;
using System.Diagnostics;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public static class Program {
public static void Main() {
var obj = new ObjectClass { Field = "Value" };
var settings = new XmlWriterSettings {
Indent = true
};
var xml = new StringBuilder();
using (var writer = XmlWriter.Create(xml, settings)) {
Debug.Assert(writer != null);
writer.WriteDocType("APIRequest", null, "https://url", null);
writer.WriteStartElement("APIRequest");
writer.WriteStartElement("Head");
writer.WriteElementString("Key", "123");
writer.WriteEndElement(); // </Head>
var nsSerializer = new XmlSerializerNamespaces();
nsSerializer.Add("", "");
var xmlSerializer = new XmlSerializer(obj.GetType(), "");
xmlSerializer.Serialize(writer, obj, nsSerializer);
writer.WriteEndElement(); // </APIRequest>
}
Console.WriteLine(xml.ToString());
Console.ReadLine();
}
}
[XmlRoot("ObjectClass")]
public class ObjectClass {
[XmlElement("Field")]
public string Field { get; set; }
}
Создайте собственный XmlTextWriter, чтобы опустить объявление XML.
Private Class MyXmlTextWriter
Inherits XmlTextWriter
Sub New(ByVal sb As StringBuilder)
MyBase.New(New StringWriter(sb))
End Sub
Sub New(ByVal w As TextWriter)
MyBase.New(w)
End Sub
Public Overrides Sub WriteStartDocument()
' Don't emit XML declaration
End Sub
Public Overrides Sub WriteStartDocument(ByVal standalone As Boolean)
' Don't emit XML declaration
End Sub
End Class
Вызов Serialize с экземпляром производного MyXmlTextWriter.
Dim tw As New MyXmlTextWriter(sb)
Dim objXmlSerializer As New XmlSerializer(type)
objXmlSerializer.Serialize(tw, obj)
Скотт Хансельман получил хороший пост по этому поводу. Некоторое время назад я использовал пример Кзу (на который ссылается блог Скотта) для того же самого, и он отлично сработал.
Один вкладыш, удалить первую строку из строки:
String.Join("\n", strXML.Split('\n').Skip(1).ToArray())
не элегантно, но кратковременно.