Pergunta

Estou a serialização de um objeto em um 1.1 aplicativo C # VS2003 / .Net. Eu preciso dele serializado sem a instrução de processamento, no entanto. Os puts classe XmlSerializer algo como isto:

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

Existe alguma maneira de obter algo como o seguinte, sem processar o texto resultante para remover a tag?

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

Para aqueles que estão curiosos, minha aparência código como este ...

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

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

Solução

O seguinte link irá levá-lo a um post onde alguém tem um método de suprimindo a instrução de processamento usando um XmlWriter e entrar em estado de um 'elemento' em vez de um estado 'Start'. Isso faz com que a instrução de processamento para não ser escrito.

Suprimir instrução de processamento

Se você passar um XmlWriter para o serializador, ele só irá emitir um processamento instrução se o estado do XmlWriter é 'Start' (ou seja, não teve nada gravados nele ainda).

// 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(); 

Neste caso, o escritor estará em um estado de 'elemento' (dentro de um elemento) assim não há instrução de processamento será escrito. Um que você terminar de escrever o XML, você pode extrair o texto a partir do fluxo subjacente e processá-lo para conteúdo do seu coração.

Outras dicas

Eu fiz uma pequena correção

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();
}

Na versão 2.0, você usaria XmLWriterSettings.OmitXmlDeclaration , e serialize para um XmlWriter - no entanto eu não acho que isso existe no 1.1; por isso não inteiramente útil -., mas apenas mais um "considerar uma atualização" coisa ... e sim, eu percebo que não é sempre possível

E sobre omitindo namespaces?

em vez de usar

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

ex:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">

Se por "instrução de processamento" você quer dizer a declaração xml, então você pode evitar isso, definindo a propriedade OmitXmlDeclaration de XmlWriterSettings. Você precisará serialize usando um XmlWriter, para alcançar este objetivo.

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();
}

Mas ah, isso não responder à sua pergunta para 1.1. Bem, por referência a outros.

Isso funciona em .NET 1.1. (Mas você ainda deve considerar uma atualização)

    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() { }
   }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top