удалить кодировку из xmlserializer

#c# #xmlserializer

#c# #xmlserializer

Вопрос:

Я использую следующий код для создания XML-документа —

 XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
new XmlSerializer(typeof(docket)).Serialize(Console.Out, i, ns); 
  

это отлично работает при создании XML-файла без атрибутов пространства имен. я хотел бы также не иметь атрибута encoding в корневом элементе, но я не могу найти способ сделать это. У кого-нибудь есть идеи, можно ли это сделать?

Спасибо

Ответ №1:

Старый ответ удален и обновлен новым решением:

Предполагая, что можно полностью удалить xml-объявление, потому что это не имеет особого смысла без атрибута encoding:

 XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", "");
using (XmlWriter writer = XmlWriter.Create(Console.Out, new XmlWriterSettings { OmitXmlDeclaration = true}))
{
  new XmlSerializer(typeof (SomeType)).Serialize(writer, new SomeType(), ns);
}
  

Комментарии:

1. Это скорее комментарий, чем правильный ответ… Попытайтесь поработать над своим ответом, или вы можете быть отклонены за это

2. Я согласен и изменил ее в лучшую. 😉

3. это сработало, но мне интересно, почему это не украшает вывод, по сравнению с тем, когда вы сериализуете FileStream вместо XmlWriter

Ответ №2:

Чтобы удалить кодировку из заголовка XML, передайте TextWriter с кодировкой null в XmlSerializer:

 MemoryStream ms = new MemoryStream();
XmlTextWriter w = new XmlTextWriter(ms, null);
s.Serialize(w, vs);
  

Объяснение

XmlTextWriter использует кодировку из TextWriter, переданную в конструкторе:

 // XmlTextWriter constructor 
public XmlTextWriter(TextWriter w) : this()
{
  this.textWriter = w;
  this.encoding = w.Encoding;
  ..
  

Он использует эту кодировку при генерации XML:

 // Snippet from XmlTextWriter.StartDocument
if (this.encoding != null)
{
  builder.Append(" encoding=");
  ...
  

Комментарии:

1. Как ни странно, ответ Ахима вызвал другие ошибки при моей сериализации… XmlTextWriter. Create() ведет себя не так, как «new XmlTextWriter()», и выдает мне ошибки с нулевыми ссылками. Этот метод отлично сработал, так что спасибо!

2. Использование, encoding которое null является хорошим способом для достижения этой цели. Обратите внимание, что в соответствии с разделом 2.8 Рекомендации XML 1.1 совершенно законно не включать объявление кодировки в объявление XML. В этом случае XML-объявление выглядит следующим образом: <?xml version="1.1"?> (или <?xml version="1.0"?> для XML 1.0).

Ответ №3:

 string withEncoding;       
using (System.IO.MemoryStream memory = new System.IO.MemoryStream()) {
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(memory)) {
        serializer.Serialize(writer, obj, null);
        using (System.IO.StreamReader reader = new System.IO.StreamReader(memory)) {
            memory.Position = 0;
            withEncoding= reader.ReadToEnd();
        }
    }
}

string withOutEncoding= withEncoding.Replace("<?xml version="1.0" encoding="utf-8"?>", "");
  

Комментарии:

1. используя строку. Замена могла бы сработать, но мне было интересно, есть ли способ сделать это с помощью xmlserializer, как я сделал выше, чтобы удалить пространство имен.

2. Меня интересует то же самое. У кого-нибудь есть ответ? Я использовал: StringBuilder. toString().Replace(«<«, «<«).Replace(«amp; >», «>»); потому что у меня был некоторый html-код, который я не хотел кодировать.

Ответ №4:

Спасибо этому блогу за помощь с моим кодом http://blog.dotnetclr.com/archive/2008/01/29/removing-declaration-and-namespaces-from-xml-serialization.aspx

вот мое решение, та же идея, но в VB.NET и, на мой взгляд, немного понятнее.

 Dim sw As StreamWriter = New, StreamWriter(req.GetRequestStream,System.Text.Encoding.ASCII)
Dim xSerializer As XmlSerializer = New XmlSerializer(GetType(T))
Dim nmsp As XmlSerializerNamespaces = New XmlSerializerNamespaces()
nmsp.Add("", "")

Dim xWriterSettings As XmlWriterSettings = New XmlWriterSettings()
xWriterSettings.OmitXmlDeclaration = True

Dim xmlWriter As XmlWriter = xmlWriter.Create(sw, xWriterSettings)
xSerializer.Serialize(xmlWriter, someObjectT, nmsp)