Сериализация XML.NET без <? xml> текстовое объявление

Если вы используете Mono, вот что:

CsharpRepl

Don Box взломал что-то очень простое несколько лет назад тоже .

20
задан bzlm 19 December 2013 в 15:19
поделиться

4 ответа

Никогда не создавайте 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; }
}
24
ответ дан 29 November 2019 в 23:02
поделиться

Создайте собственный 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)
1
ответ дан 29 November 2019 в 23:02
поделиться

Скотт Хансельман получил хороший пост по этому поводу. Некоторое время назад я использовал пример Кзу (на который ссылается блог Скотта) для того же самого, и он отлично сработал.

1
ответ дан 29 November 2019 в 23:02
поделиться

Один вкладыш, удалить первую строку из строки:

String.Join("\n", strXML.Split('\n').Skip(1).ToArray())

не элегантно, но кратковременно.

-2
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

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