Пропуск инструкции обработки XML при сериализации объекта - PullRequest
10 голосов
/ 03 октября 2008

Я сериализую объект в приложении C # VS2003 / .Net 1.1. Мне нужно, чтобы он сериализован без инструкции по обработке, однако. Класс XmlSerializer выдает что-то вроде этого:

<?xml version="1.0" encoding="utf-16" ?> 
<MyObject>
    <Property1>Data</Property1>
    <Property2>More Data</Property2>
</MyObject>

Есть ли способ получить что-то вроде следующего, не обрабатывая полученный текст для удаления тега?

<MyObject>
    <Property1>Data</Property1>
    <Property2>More Data</Property2>
</MyObject>

Для любопытных мой код выглядит следующим образом ...

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();

using ( TextWriter stringWriter = new StringWriter(builder) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}

Ответы [ 6 ]

9 голосов
/ 26 ноября 2008

Я сделал небольшую поправку

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) )
{   
   serializer.Serialize(stringWriter, comments);  
  return builder.ToString();
}
7 голосов
/ 03 октября 2008

В 2.0 вы должны использовать XmLWriterSettings.OmitXmlDeclaration и сериализовать в XmlWriter - однако я не думаю, что это существует в 1.1; так что не полностью полезно - но просто еще одна вещь "подумайте об обновлении" ... и да, я понимаю, что это не всегда возможно.

3 голосов
/ 03 октября 2008

Следующая ссылка приведет вас к сообщению, где у кого-то есть метод подавления инструкции обработки с использованием XmlWriter и перехода в состояние «Элемент», а не в состояние «Пуск». Это приводит к тому, что инструкция по обработке не записывается.

Инструкция по обработке подавления

Если вы передадите XmlWriter в сериализатор, он будет только обрабатывать инструкция, если состояние XmlWriter 'Start' (то есть, не имеет ничего написано еще нет).

// Assume we have a type named 'MyType' and a variable of this type named 
'myObject' 
System.Text.StringBuilder output = new System.Text.StringBuilder(); 
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); 
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); 
System.Xml.Serialization.XmlSerializer serializer = new 
System.Xml.Serialization.XmlSerializer(typeof(MyType)); 


writer.WriteStartElement("MyContainingElement"); 
serializer.Serialize(writer, myObject); 
writer.WriteEndElement(); 

В этом случае писатель будет находиться в состоянии «Элемент» (внутри элемента) поэтому никакая инструкция по обработке не будет написана. Тот, который вы заканчиваете писать XML, вы можете извлечь текст из основного потока и обработать его содержание вашего сердца.

1 голос
/ 09 марта 2009

А как насчет пропущенных пространств имен?

вместо использования

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                namespaces.Add("", "");

например:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
0 голосов
/ 26 февраля 2009

Это работает в .NET 1.1. (Но вы все равно должны рассмотреть вопрос об обновлении)

    XmlSerializer s1= new XmlSerializer(typeof(MyClass)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add( "", "" );


    MyClass c= new MyClass();
    c.PropertyFromDerivedClass= "Hallo";

    sw = new System.IO.StringWriter();
    s1.Serialize(new XTWND(sw), c, ns);
    ....

   /// XmlTextWriterFormattedNoDeclaration
   /// helper class : eliminates the XML Documentation at the
   /// start of a XML doc. 
   /// XTWFND = XmlTextWriterFormattedNoDeclaration
   public class XTWFND : System.Xml.XmlTextWriter
   {
     public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
     public override void WriteStartDocument() { }
   }
0 голосов
/ 03 октября 2008

Если под «инструкцией обработки» вы подразумеваете объявление xml, то вы можете избежать этого, установив свойство OmitXmlDeclaration для XmlWriterSettings. Для этого вам нужно сериализовать с использованием XmlWriter.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

using ( XmlWriter stringWriter = new StringWriter(builder, settings) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}

Но, ах, это не ответит на ваш вопрос для 1.1. Ну для справки к другим.

...